并发编程的三种实现方式

版权声明:转载请注明原创地址 https://blog.csdn.net/ke369093457/article/details/83893026

java天生就是多线程的编程语言,创建新的线程有三种实现方式,分别是:

继承Thread,实现Runable,实现Callable<T>

代码如下:

//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

	}

}

三种方式又分别有自己的启动方式

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;

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

猜你喜欢

转载自blog.csdn.net/ke369093457/article/details/83893026
今日推荐