您的位置:首页 > 编程语言

并发编程的三种实现方式

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方法,这样才能终止线程

 

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: