启动多线程任务
创建线程有三种方式 一种为继承thread和实现Runnable或者Callable。但是在实际过程中创建线程都是去实现Runnable和Callable。两种分别对应执行任务不需要返回。后者会有返回值。所以看是否需要有返回来确定具体实现方式。
场景一:图片上传功能,需要将数据上传并保持数据,同时需要对图片进行二次处理,比如将上传的图片切分成不同样式。但是最终切没有切。不需要管。就像A同时在做某事,做到一半了,又有一个人来帮忙做,A将一部分能分配的任务叫B来完成,但是B是否能不能完成,A不管。该模式就可通过实现runnable。有多少人帮助,就启动多少runnable。
场景二:同为上述任务,但是图片处理需要将图片安装不同用户放到不同目录中,而A不确定图片在哪个目录,需要B将图片切完并告诉A图片的路径。这个时候就需要返回图片信息,就需要使用Callable。
代码试下:要求jdk版本1.5以上。当前版本为jdk 1.8
------------------------------------------代码实现-------------------------------------------
package TheradDemo;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThreadTest {
public static void main(String[] args) {
//继承 Thread
ExtendsThread extendsThread = new ExtendsThread();//继承Thread
extendsThread.start();//启动
//实现Runnable
RunnableThread runnableThread = new RunnableThread();//实现Runnable
new Thread(runnableThread).start();//启动线程,可以看出创建Thread。Thread才能启动线程
//实现 Callable 同时用FutureTask 获取返回结果 。需要返回结果两者必须同时使用
CallableThread callableThread = new CallableThread();//实现Callable。new对象
FutureTask<String> future = new FutureTask<String>(callableThread);//用来装返回结果。
new Thread(future).start();//启动
//获取返回值
String reuslt = null;
try {
reuslt = future.get();//获取返回结果
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
System.out.println("result : " + reuslt);
//将runnable任务执行10遍 。这个才是多线程的体现
for(int i=0;i<10;i++) {
// RunnableThread runnableThread = new RunnableThread();//可以看出直接写出现错误。
//原因为需要创建不同线程,类似给10个不同的人来做,10个人的名字都不一样
new Thread( new RunnableThread()).start();
}
}
}
class ExtendsThread extends Thread{
public void run(){
System.out.println("---第一种---- 继承Thread-----");
}
}
class RunnableThread implements Runnable {
@Override
public void run() {
System.out.println("---第二种---- 实现Runnable-----");
}
}
class CallableThread implements Callable<String> {
@Override
public String call() throws Exception {
String doTask = "---第三种---- 实现Callable----";
return doTask;
}
}
------------------------------------------代码实现-------------------------------------------
心得:多线程实现网上有很多,但是个人感觉,多线程,应该可以说成,启动 -->线程 -- >任务。启动都必须是thread(不使用线程池)。线程即为implements 而runnable和Callable里面的为任务。任务劲量简单。只是作为启动的任务的入口,具体需求使用具体的方法来解决。需要启动多少个,就new多少个thread来启动具体任务,比如最后在for中,就需要new多个thread,同时线程名称runnableThread 也需要不同。而runnableThread 里面的才是任务。以后再撸别人的代码,可以自行查看,那个是线程,那个是任务,又是在哪启动的。有时候在任务比较复杂,在创建线程的时候单独使用方法,线程在其他地方启动。所以我将多线程,分为启动、线程、任务。
补充:直接使用threa启动线程非诚消耗资源,都是使用线程池管理。一个正常项目是不允许随意创建先的线程。
线程池关系线程可以参考https://www.jianshu.com/p/1e772549d0d0
网友评论