ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-07-12 18:32:34  阅读:152  来源: 互联网

标签:Runnable run Thread 接口 Callable 线程 多线程


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有