Java原生支持多线程,主要通过以下四种方式实现多线程:
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
- 线程池
继承Thread类
通过创建Thread类的子类,并重写run()方法,通过调用start()方法启动线程。
public class TestThread extends Thread { @Override public void run() { //run方法线程体 for (int i = 0; i < 10; i++) { System.out.println("run方法线程体" + i); } } public static void main(String[] args) { //main线程,主线程 TestThread testThread = new TestThread();//创建一个线程对象 testThread.start();//调用start()方法,启动线程 for (int i = 0; i < 10; i++) { System.out.println("main方法线程体" + i); } }}
可以看到两个线程的执行过程是混乱的,这就说明两个线程的执行顺序是随机的,并不是按照调用顺序来执行的。
但一般不建议使用继承Thread类的方式实现多线程,因为Java是单继承的,子类继承Thread类之后,会限制后续扩展。实现Runnable接口
Thread类就实现了Runnable接口,我们也可以实现Runnable接口并实现run()方法来实现多线程。在创建Thread类的时候,将待执行线程作为参数传递,调用start()方法启动。
//实现Runnable接口,并实现run()方法public class TestThread3 implements Runnable { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("run 方法线程: " + i); } } public static void main(String[] args) { TestThread3 testThread3 = new TestThread3();//创建新线程 new Thread(testThread3).start();//创建Thread类,并将待执行线程作为参数传递进去,调用start()方法启动 for (int i = 0; i < 5; i++) { System.out.println("main 方法线程: " + i); } }}
相比于第一种方案,更推荐使用接口方案,继承Runnable接口避免了收到单继承的限制,也方便同一个对象被多个线程使用实现Callable接口
Callable接口类似于Runnable接口,都是为 其实例可能由另一个线程执行的类 而设计的。 不过相比于Runnable接口实现多线程的方式,实现Callable接口的多线程方式可以返回结果,并可能抛出异常。实现Callable接口并实现call方法。
public class TestCallable implements Callable { @Override public Boolean call() throws Exception { //实现call()方法 for (int i = 0; i < 5; i++) { System.out.println("call 方法线程: " + i); } return true; } public static void main(String[] args) { TestCallable testCallable = new TestCallable(); //创建新任务 ExecutorService executorService = Executors.newFixedThreadPool(1); //创建线程池 Future res = executorService.submit(testCallable); //将任务提交到线程池 for (int i = 0; i < 5; i++) { System.out.println("main 方法线程: " + i); } executorService.shutdown(); //需要手动关闭线程池服务 }}
线程池
待编辑…