编程语言
首页 > 编程语言> > Java多线程Callable接口的实现及实现Runnable接口

Java多线程Callable接口的实现及实现Runnable接口

作者:互联网

Java多线程之Callable接口的实现

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
 
/*
 * 一、创建执行线程的方式三:实现 Callable 接口。 相较于实现 Runnable 接口的方式,方法可以有返回值,并且可以抛出异常。
 *
 * 二、执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。  FutureTask 是  Future 接口的实现类
 */
public class TestCallable {
 
    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
 
        //1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。
        FutureTask<Integer> result = new FutureTask<>(td);
 
        new Thread(result).start();
 
        //2.接收线程运算后的结果
        try {
            Integer sum = result.get();  //FutureTask 可用于 闭锁 类似于CountDownLatch的作用,在所有的线程没有执行完成之后这里是不会执行的
            System.out.println(sum);
            System.out.println("------------------------------------");
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
 
}
 
class ThreadDemo implements Callable<Integer> {
 
    @Override
    public Integer call() throws Exception {
        int sum = 0;
 
        for (int i = 0; i <= 100000; i++) {
            sum += i;
        }
 
        return sum;
    }
 
}

Java多线程之Runnable接口的实现

/*
	需求: 实现一个售票程序
	
	创建线程的第二种方式:实现Runnable接口
	步骤:
	1,定义类实现Runnable接口
	2,覆盖Runnable接口中的run方法
		将线程要运行的代码存放在该run方法中
	3,通过Thread 类建立线程对象
	4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
		为什么要将Runnable接口中的子类对象传递给Thread的构造函数
		因为,自定义的run方法所属的对象是Runnable接口的子类对象
		所以要让线程去指定指定对象的run方法,就必须明确该run方法所属对象。
	5,调用Thread类的start方法 开启线程并调用Runnable接口子类的run方法
            实现方式和继承方式的区别:
                实现方式好处:避免了单继承的局限性
                在定义建议使用实现方式
            两种方式区别:
                继承Thread:线程代码存放在Thread子类run方法中。
                实现Runnable:线程代码存放在接口的子类的run方法中、
*/
 
class Tick implements Runnable
{
	private int tick = 50;
 
	public void run()
	{
		while(true)
		{
			if(tick > 0)
				System.out.println( Thread.currentThread().getName() + " sail --" + tick--);
		}
	}
}
 
class TickDemo
{
	public static void main(String []args)
	{
		Tick t = new Tick();
 
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		Thread t3 = new Thread(t);
		Thread t4 = new Thread(t);
 
		t1.start();
		t2.start();
		t3.start();
		t4.start();
 
	}
}

综上例子可以看到: Callable 和 Future接口的区别

(1)Callable规定的方法是call(),而Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
(3)call()方法可抛出异常,而run()方法是不能抛出异常的。
(4)运行Callable任务可拿到一个Future对象, Future表示异步计算的结果。
它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

标签:Runnable,run,Thread,接口,Callable,线程,多线程
来源: https://www.cnblogs.com/zh76412950/p/16471182.html