java_10:线程创建的方式二

除了继承Thread类和实现Runnable接口两种创建线程的方式,JDK5.0还新增类两种线程创建方式:

新增方式一:实现Callable接口

好处:
(1)与使用Runnable相比,Callable功能更强大些
(2)相比run()方法,可以有返回值
(3)方法可以抛出异常
(4)支持泛型的返回值
(5)需要借助FutureTask类,比如获取返回结果
Future接口:
1)可以对具体的Runnable\Callable任务的执行结果进行取消、查询是否完成、获取结果等
2)FutureTask是Future接口唯一的实现类
3)FutureTask同时实现了Runnable,Future接口。
【它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值】

创建的过程和实例

//1.创建实现类
class NumThread implements Callable {
//2.重写call()方法
    @Override
    public Object call() throws Exception {
        int sum=0;
        for(int i=1;i<=100;i++){
            if(i%2==0){
                System.out.println(i);
                sum+=i;
            }
        }
        return sum;
    }
}
public class ThreadNew {
    public static void main(String[] args) {
        //3.创建实现Callable接口的实例对象
        NumThread numThread = new NumThread();
    //4.将实现类的对象作为参数传递到FutureTask构造器,创建 FutureTask对象
        FutureTask futureTask = new FutureTask(numThread);
    //5.将FutureTask的对象作为参数传递到Thread类的构造器中,并调用start()
        new Thread(futureTask).start();
//6.需要的话,可以借助FutureTask的对象进行一系列操作
        try {
            //get()返回值为FutureTask构造器参数Callable实现类重写的call()的返回值
            Object sum = futureTask.get();
            System.out.println("总和:"+sum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

新增方式二:使用线程池

好处:

1)提高响应速度--减少创建新线程的时间
2)降低资源消耗--重复利用线程池中的线程,不需要每次都创建
3)便于线程管理:
corePoolSize:核心池的大小
maximumPoolSize:最大线程数
keepAliveTime:线程没有任务时最多保持多长时间会终止
线程池相关API--ExecutorService和Executors
ExecutorService:真正的线程池接口,常见子类ThreadPoolExecutor
Executors:工具类、线程池的工厂类。用于创建并返回不同类型的线程池

原文地址:https://blog.51cto.com/14234228/2468735

时间: 2024-11-03 01:38:14

java_10:线程创建的方式二的相关文章

创建多线程方式二:实现Runnable接口

1.创建一个实现了Runnable接口的类 2.实现类去实现Runnable中的抽象方法:run() 3.创建实现类的对象 4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象 通过Thead类的对象调用start方法 比较创建线程的两种方式: 开发中:优先选择实现Runnable接口的方式 1.实现的方式没有类的单继承性的局限性 2.实现的方式更适合处理多个线程有共享数据的情况 联系:public  class Thread implements Runnable 相同

java_6 线程创建的方式

一.创建线程的方法 1.继承Thread类 实现步骤:(1)创建一个继承于Thread类的子类(2)重写Thread类的run()方法[线程执行的操作声明在run()中](3)创建Thread类的子类的对象(4)通过此对象调用start()方法[①启动线程②调用当前线程对象的run方法] 代码 //(1)创建一个继承于Thread类的子类 class MyThread1 extends Thread{ public MyThread1(String name){ super(name); } /

MFC 线程创建方式

MFC 分UI线程和工作线程,一般现在的应用程序都是一个主UI线程和N个工作线程来完成工作.主UI线程获取到工作线程发送的信息来刷新界面. 不过因为工作需要,MFC有要维护的项目,因此就学习一下MFC创建UI线程,使用工作线程的方式. 1.UI线程,继承CWinThread类  1 class CAddDeviceApp : public CWinThread 2 { 3     DECLARE_DYNCREATE(CAddDeviceApp) 4 protected: 5     CAddDe

iOS开发——多线程OC篇&amp;(二)线程创建

创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 - (BOOL)isMa

JAVA并发编程-线程创建(二)

对于线程的创建及更加详细的信息可以参看博客<JAVA--线程>,下面是对线程创建的细化及简单再实现. 在java中如果要创建线程的话,一般有两种方式:1)继承Thread类:2)实现Runnable接口. 方式一:继承Thread类 MyThread: package com.tgb.hjy; public class MyThread extends Thread{ private String name; public MyThread(String name){ this.name=na

爪哇国新游记之十二----线程创建的两种形式

public class Thread1 extends Thread{ public void run(){ int i=0; while(i<10){ i++; System.out.println(i); } } public static void main(String[] args){ Thread1 t=new Thread1(); t.start(); } } public class Thread2 implements Runnable{ @Override public v

django之创建第7-5-第二种传值方式(time/1232/xiaodneg)

1.修改views文件 def foo(request,myID,myName): t = loader.get_template("foo.html") user = {"today": datetime.datetime.now(),"id":myID,"name":myName} c = Context(user) return HttpResponse(t.render(c)) 2.创建foo.html文件 <!

锁和多线程:线程创建3种方式(一)

线程 锁Synchronized 1.线程创建 2.线程安全 搞明白 线程 锁和多线程系列 1.线程创建 线程创建常见的三种方式: 继承Thread类 实现Runnable接口 实现Callable接口 第三种方式有异步调用效果,类似js中的ajax可以接收返回值,其余两种不能. package thread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import

python 线程(创建2种方式,守护进程,锁,死锁,递归锁,GIL锁,其他方式)

###############总结############ 线程创建的2种方式(重点) 进程:资源分配单位    线程:cpu执行单位(实体) 线程的创建和销毁的开销特别小 线程之间资源共享,是同一个进程中的资源共享,会涉及到安全问题,所以需要加锁解决 锁:牺牲了效率,保证了数据安全(重点) 死锁现象:出现在嵌套的时候,双方互相抢对方已经拿到的锁,导致双方互相等待(重点) 递归锁: 解决了死锁现象(重点) rlock 首先本身就是个互斥锁,维护了一个计数器,每次acquire+1,release