方式一
1自定义类继承Thread类,覆写run方法(线程任务)2实例化自定义类对象,该对象就是一个具备线程执行的对象3线程类的对象run方法直接调用和普通类的对象调用没有区别,启动线程一律使用Thread类提供的start()方法
* 直接调用run方法,实际还是同步执行,与线程无关
javamyThread1.run();
*调用start方法,才会异步执行,跟线程有关,该方法不能多次调用,只能执行一否则会抛出异常(非受查异常:IllegalThreadStateException)
myThread1.start();
(native修饰的方法成为本地方法,需依赖平台实现JNI)
方式二(代理模式)
业务无返回结果
2·1自定义类继承Runnable接口,覆写run方法
2·2实例化Thread类对象,通过构造方法传入Runnable接口实现
2·3线程的启动方式start
MyThread mt1 = new MyThread("子线程1");
Thread thread1 = new Thread(mt1);
thread1.start();
(Java中Thread类本身也实现了Runnable接口,与用户自定义的线程类共同组成代理模式。其中Thread类实现辅助操作,包括现成的资源调度等任务,而自定义线程类完成真实业务)
方式三
业务有返回结果
V call()throws Exception 线程执行后有返回结果
3·1自定义类继承java.util.concurrent.Callable接口,实现覆写call方法
3·2Future:接收Callable接口的返回值 V get();
FutureTask 包装Callable接口实现类的对象
3·3实例化Thread类对象,通过构造方法传入Runnable接口实现
3·4线程的启动方式start
3·5通过FutureTask对象的get(阻塞作用)
FutureTask:获取结果(将来的任务)
方式四
通过线程池的方式使用线程