1、创建线程的常用方式:
注意: 线程之间是独立的,先后顺序由调度方法决定。
自定义类继承Thread类
自定义类实现Runnable接口
自定义类实现Callable接口
匿名内部类方式
继承方式:
1)java是单继承方式,继承Thread类之后不能继承其他类。
2)从操作上来分析:继承方式更简单,可以直接使用父类方法
3)继承方式不能多线程共享同一资源 (不能共享非静态资源) 。
实现方式:
1)java类可多实现接口,并且可以继承其他类,也可以实现其他接口
2)从操作上来分析:实现方式略复杂,获取当前线程得使用Thread.currentThread( ) 方法。
3)实现方式 可以多线程共享同一资源。
不同点:
1、实现方式不同,继承和实现
2、Callable接口中是call方法且有返回值,并且此方法会抛出异常。
总结:使用实现Runnable接口的方式创建线程,可以避免java中的单继承问题,有利于程序的健壮性,代码可以被多个新城共享。通过实现Callable接口创建线程可以使用加入线程池,并且可以拿到一个Future对象,表示异步计算的结果。
2.方式详解:
自定义类继承Thread类
继承Thread类——> 重写run()方法;
class Processor1 extends Thread {
public void run() {
// do work
}
}
//实例化线程
public static void main(String args[] ) {
Processor p = new Processor1();
}
自定义类实现类实现Runnable接口
实现Runnable接口 ————> 实现接口中的run()方法
class Processor2 implements Runnable {
@Override
public void run() {
//do work
}
}
//实例化线程
public static void main(String args[] ) {
Processor2 p = new Processor();
Thread t = new Thread(t);
}
匿名内部类实现
new Thread(new Runnable() {
@override
public void run() {
//do something
}
}})
自定义类实现Callable接口---------------线程池中使用
实现Callable接口 ————> 重写接口中的call()方法
创建线程池,(Exexutors工具类提供的方法创建线程池)
创建Callable接口实现类的实例
将实例对象通过线程池的submit方法提交
class Processor3 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName()); //获取当前线程名
return null;
}
}
public static void main(String args[]) {
//实现 Callable 接口方式创建线程
// 创建线程池
ExecutorService executorService =Executors.newSingleThreadExecutor();
Processor3 p3 = new Processor3(); //创建实例对象
executorService.submit(p3); // 提交给线程池(即运行此线程)
executorService.shutdown(); //关闭线程池
}