多线程的三种实现方式

多线程的实现有三种方式:

1.继承Thread类

2.实现Runnable接口

3.实现Callable接口,不过该方式需要利用线程池


第一种和第二种方式比较简单,就不赘述了;主要是讲解第三种方式。

实现Callable接口的例子:

package executorpool;

import java.util.concurrent.Callable;

public class MyCallable1 implements Callable<Integer> {
    private int  number;
    public MyCallable1(int m){
    	this.number=m;
    }
    
	@Override
	public Integer call() throws Exception {
		// TODO Auto-generated method stub
		int sum=0;
		for(int x=0;x<=number;x++){
			sum +=x;
		}
		return sum;
	}
}

测试实现Callable接口的demo:

package executorpool;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

public class CallableDemo2 {
	public static void main(String[] args) throws InterruptedException, ExecutionException{
		//创建线程对象
		ExecutorService pool=Executors.newFixedThreadPool(2);
		//可以执行Runnable对象或者Callable对象代表的线程
		FutureTask<Integer> f1= (FutureTask<Integer>) pool.submit(new MyCallable1(100));
		Future<Integer> f2= pool.submit(new MyCallable1(200));

		//获取它的值
		int totalOne=f1.get();
		int totalTwo=f2.get();
		
		//然后打印它的值
        System.out.println(totalOne);
        System.out.println(totalTwo);		

        //关闭线程池
        pool.shutdown();
	}

}

 计算结果:

5050
20100

       利用线程池实现Callable接口 ,可以向方法里面传递参数,有一个泛型去接收参数!上面线程池的例子,就通过两个线程分别计算加法值,利用Future接口去接收,通过future接收之后 ,再可以利用get方法去获取里面的值;其中FutureTask是Future接口的一个实现类;

猜你喜欢

转载自blog.csdn.net/zy345293721/article/details/82424571