Java 线程创建的三种方式

Java Thread 创建的三种方式

概述

Java为单进程多线程的模式,在处理并发时常常使用多个线程来处理,在Tomcat druid等中间件中都有线程的应用。

线程是进程的执行单元,线程依靠进行执行,只能使用进程分配的资源;在Java中每个线程都有单独的程序计数器、栈空间,相对于进程开销较小,线程是cpu调试的最小单元。

线程可分为主线程 子线程 后台线程,主线程由JVM启动,并调用main方法,子线程由用户开启,后台线程为了线程的一种。后台线程不能单独开启,当JVM中只有后台线程时会退出。创建线程有三种方法。

亲娘Thread

Thread代表了线程;可以直接使用子类继承Thread类的方法创建一个新的子线程。

public void demo(){
  //创建线程实例
    MyThread thread=new MyThread();
  //调用start方法启动线程
    thread.start();
}
//定义子类
public class MyThread extends Thread{
  //重写run方法
    @Override
    public void run() {
        super.run();
    }
}

亲娘Thread生出了MyThead;MyThread得到了Thread的所有原生关爱。

二娘Runnable

Runnable实际并没有创建线程;Runnable实则是一个接口且只有一个run方法,这个接口可以使用lambda表示也可以实现一个子类继承自Runnable接口,最后将实例交给Thread执行。

public void demo(){
  //使用lambda表达式表示入口并创建一个线程
  new Thread(()->{
    System.out.println("Runnable");
  })
    //启动线程
    .start();
}

二娘Runnable实则还是交给了Thread去关爱。

三娘FutureTask

Callable可比Runnable要争气点;可以获取到执行的结果;但还需要和Future配合使用;Future可以取消正在执行的任务。

public interface Future<V> {

  //取消
    boolean cancel(boolean mayInterruptIfRunning);
//是否已经取消
    boolean isCancelled();
//是否完成
    boolean isDone();

    V get() throws InterruptedException, ExecutionException;

    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

虽然CallableRunnable要争气,两兄弟还是要看Thread的脸色,所以两兄弟也比较团结会取长补短。

FutureTask会护着这两兄弟,创建一个FutureTask可以使用Callable Runnable做为入参,再提交到ExecutorService线程池中进行调度,当然也可以交给Thread进行调度;因为它实现了Runnable接口和它关系也不错。

 public void demo() throws ExecutionException, InterruptedException {
   //使用Callable创建FutureTask
        FutureTask<Boolean> task = new FutureTask<>(() -> {
            System.out.println("Callable");
            return true;
        });
   //创建线程池
        ExecutorService executorService = Executors.newCachedThreadPool();
   //托管给线程池调度
        Future<?> future = executorService.submit(task);
   //获取结果
        Object o = future.get();
   //用Thread调试FutureTask
        new Thread(task)
                .start();
    }

精彩推荐:
Java ClassLoader详解双亲委派的实现原理
Java 反射技术应用与详解
Java 8种基本值类型

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值