java多线程的实现
1. 继承thread;
Thread类是Runable接口的一个实例,然后用start方法来启动一个新线程来跑重写的run方法。
2. 实现接口runnable;
当我们写的类本身就有extend,继承的父类的时候,那么我们就可以用实现接口Runnable。到时候只需要对此类进行实例化,然后传到实例化的线程Thread里,最后启动线程就可以调用此类重写的run方法。
例子:
//实现接口Runnable
public class MyThread extends OtherClass implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
}
//启动线程
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
查看Thread API发现还有其他的构造方法。
public Thread(Runnable target)
分配新的 Thread 对象。这种构造方法与 Thread(null, target,gname) 具有相同的作用,其中的 gname 是一个新生成的名称。自动生成的名称的形式为 “Thread-”+n,其中的 n 为整数。public Thread(ThreadGroup group,Runnable target)
分配新的 Thread 对象。这种构造方法与 Thread(group, target, gname) 具有相同的作用,其中的 gname 是一个新生成的名称。自动生成的名称的形式为 “Thread-”+n ,其中的 n 为整数。public Thread(String name)
public Thread(ThreadGroup group,String name)
public Thread(Runnable target,String name)
3. 实现接口Callable
和Future,线程池结合使用;
区别于runable
- callable 规定的方法是call()带返回值,runable规定方法是run()不带返回值
- call()方法可抛出异常,run()方法不可抛出
//例如:
class ThreadDemo implements Callable<Integer> {
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i <= 100000; i++) {
sum += i;
}
return sum;
}
}
ThreadDemo td = new ThreadDemo();
//执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。
FutureTask<Integer> result = new FutureTask<>(td);
new Thread(result).start();
4. 结合使用executorservice
executorservice接口
public interface ExecutorServiceextends Executor
超级接口:Executor(注意不是Executors)
子接口:ScheduledExecutorService
实现类:AbstractExecutorService,ThreadPoolExecutor,ScheduledThreadPoolExecutor
参考:https://blog.youkuaiyun.com/suifeng3051/article/details/49443835
ExecutorService的执行
execute(Runnable)
接收Runnable实例,并且异步执行,但是不能获取task的执行结果。
submit(Runnable)
可以返回一个future对象,可以检查提交的任务是否执行完毕
submit(Callable)
有返回值,返回任务执行结果