并发编程的三种实现方式
2018-11-09 13:18
176 查看
版权声明:转载请注明原创地址 https://blog.csdn.net/ke369093457/article/details/83893026
java天生就是多线程的编程语言,创建新的线程有三种实现方式,分别是:
继承Thread,实现Runable,实现Callable<T>
代码如下:
[code]//Thread class ThreadTest extends Thread { @Override public void run() { // TODO Auto-generated method stub super.run(); } } //Callable class CallableTest implements Callable<String> { @Override public String call() throws Exception { // TODO Auto-generated method stub return null; } } //Runnable class RunableTest implements Runnable { @Override public void run() { // TODO Auto-generated method stub } }
三种方式又分别有自己的启动方式
[code]package com.hyan.client; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class Test { public static void main(String[] args) throws InterruptedException, ExecutionException { // Thread运行 ThreadTest threadTest = new ThreadTest(); threadTest.start(); Thread.sleep(50); threadTest.interrupt(); // Callable运行 CallableTest callableTest = new CallableTest(); FutureTask<String> futureTask = new FutureTask<>(callableTest); Thread thread = new Thread(futureTask); thread.start(); Thread.sleep(50); thread.interrupt(); System.out.println("callable的返回值:" + futureTask.get()); // Runnable运行 RunableTest runableTest = new RunableTest(); Thread runThread = new Thread(runableTest); runThread.start(); Thread.sleep(50); runThread.interrupt(); } } class ThreadTest extends Thread { @Override public void run() { // TODO Auto-generated method stub super.run(); System.out.println(Thread.currentThread().getName() + ">1>>>>>>>>>" + isInterrupted()); while (!isInterrupted()) { try { Thread.sleep(20); System.out.println(Thread.currentThread().getName() + ">1>>>>>>>>>run"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); // 需要在catch中再次调用interrupt,这样才能终止while interrupt(); } } // isInterrupted()是实例方法,是调用该方法的对象所表示的那个线程的isInterrupted(),不会重置当前线程的中断状态 System.out.println(Thread.currentThread().getName() + ">1>>>>>>end" + isInterrupted()); // interrupted()是静态方法:内部实现是调用的当前线程的isInterrupted(),并且会重置当前线程的中断状态 Thread.interrupted(); System.out.println(Thread.currentThread().getName() + ">1>>>>>>end改变后的状态" + isInterrupted()); } } class CallableTest implements Callable<String> { @Override public String call() throws Exception { // TODO Auto-generated method stub while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(20); System.out.println(Thread.currentThread().getName() + ">2>>>>>>>>>run"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); Thread.currentThread().interrupt(); } } System.out.println(Thread.currentThread().getName() + ">2>>>>>>end" + Thread.currentThread().isInterrupted()); return "CallableTest end "; } } class RunableTest implements Runnable { @Override public void run() { // TODO Auto-generated method stub while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(20); System.out.println(Thread.currentThread().getName() + ">3>>>>>>>>>run"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); Thread.currentThread().interrupt(); } } System.out.println(Thread.currentThread().getName() + ">3>>>>>>end" + Thread.currentThread().isInterrupted()); } }
如果要终止一个线程,可以使用stop()方法,但是已经被弃用,现在应该使用interrupt来终止线程的执行;
开发过程中可以通过interrupt方法改变中断状态,在线程中捕捉线程的中断状态,当isInterrupted()为true时,代表中断线程,但是具体的实现代码还需要自己去中断。
注:
interrupt方法改变中断状态也就是isInterrupted()变为true
isInterrupted()判断线程是否需要中断
interrupted()为静态方法,用来恢复线程的中断状态,也就是将isInterrupted()变为false;
[code]Thread-0>1>>>>>>>>>false Thread-0>1>>>>>>>>>run Thread-0>1>>>>>>>>>run Thread-0>1>>>>>>endtrue Thread-0>1>>>>>>end改变后的状态false java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at com.hyan.client.ThreadTest.run(Test.java:44) Thread-1>2>>>>>>>>>run Thread-1>2>>>>>>>>>run java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at com.hyan.client.CallableTest.call(Test.java:73) at com.hyan.client.CallableTest.call(Test.java:1) at java.util.concurrent.FutureTask.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Thread-1>2>>>>>>endtrue callable的返回值:CallableTest end Thread-2>3>>>>>>>>>run Thread-2>3>>>>>>>>>run java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at com.hyan.client.RunableTest.run(Test.java:96) at java.lang.Thread.run(Unknown Source) Thread-2>3>>>>>>endtrue
当子线程中包含了等待,在InterruptedException中应该再次调用interrupt方法,这样才能终止线程
阅读更多
相关文章推荐
- [精通Objective-C]三种实现并发编程的方式
- iOS中并发编程的实现方式及各种方式的比较
- 【Android 并发编程】线程间通信的三种基本方式,android线程
- 分布式锁解决并发的三种实现方式
- 并发编程实现的基本方式、线程池创建及执行任务、线程优先级、后台线程
- Java 并发编程深入学习(一)——实现多线程的方式
- JAVA并发编程学习笔记------线程的三种创建方式
- Linux 网络编程——并发服务器的三种实现模型
- Android并发编程线程间通信的三种基本方式
- 【Linux网络编程】并发服务器的三种实现模型
- Android并发编程线程间通信的三种基本方式
- 并发编程实战 1.1. 实现多线程的两种方式
- java中多个窗口同时买票的并发三种安全实现方式
- Linux 网络编程——并发服务器的三种实现模型
- Linux 网络编程——并发服务器的三种实现模型
- 编程实现短信发送三种方式
- java 多线程编程三种实现方式
- Linux 网络编程——并发服务器的三种实现模型
- Java高并发编程——常见的锁及实现方式(2)
- 并发编程学习总结(一) :java 创建线程的三种方式的优缺点和实例(转载自:http://blog.csdn.net/u011784767/article/details/51315007)