线程的创建与操作

本文介绍了Java中线程的创建和管理,包括继承Thread、实现Runnable、使用Callable和FutureTask以及利用线程池ExecutorService创建线程的方法。同时,讨论了线程的基本操作如sleep、interrupt、join和yield,以及守护线程的概念和特性。
摘要由CSDN通过智能技术生成

Thread类

一个线程在Java中使用一个Thread实例来描述。Thread类是Java语言的一个重要的基础类,位于java.lang包中。

Thread类主要属性
属性简介
id线程id
name线程名称
priority优先级
daemon是否为守护线程 提供后台服务的线程
threadStatus线程状态 new runable blocked waiting time_waiting terminated

四种创建线程的方法

  1. 继承thread 重写run方法
public class CreateDemo {

    public static Integer plus =0;
    //继承thread

    public  static class ThreadDemo1 extends Thread{
        @Override
        public void run() {
            for (int i = 0; i <10 ; i++) {
                plus++;
                System.out.println("第"+i +"累加");

            }
        }
    }

    @Test
    public void testEX() throws InterruptedException {

        ThreadDemo1 demo1 = new ThreadDemo1();
        demo1.start();
    }
  1. 实现Runable接口,作为实际参数传递给Thread构造器,创建线程
 public  static class  RunnableDemo implements Runnable{

        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName()+"第"+i+"次轮询");
            }
        }
    }

    @Test
    public void testRunnable(){
        for (int i = 0; i < 5; i++) {
            new Thread(new RunnableDemo()).start();
        }
    }
  1. 使用Callable和FutureTask创建可有返回值的线程,实现Callable接口,作为FutureTask的构造方法入参,创建FutureTask,FutureTask实例作为Thread构造方法入参,创建线程实例。
    类关系图
public static class CallableDemo implements Callable<Long>{

    @Override
    public Long call() throws Exception {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            
            System.out.println(Thread.currentThread().getName()+i+"次轮询·");
        }
        Thread.sleep(100);
        long endTime = System.currentTimeMillis();
        return endTime-startTime;
    }
}

@Test
public void testCallable() {
    FutureTask<Long> futureTask = new FutureTask<>(new CallableDemo());
    Thread thread = new Thread(futureTask);
    thread.start();
    try {
        Long result = futureTask.get();
        System.out.println("执行结果为" + result);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

}
  1. 线程池方法创建线程
    ExecutorService是Java提供的一个线程池接口,每次我们在异步执行target目标任务的时候,可以通过ExecutorService线程池实例去提交或者执行。Executors工厂类可创建固定数量的线程池实例。
    在这里插入图片描述
@Test
public void  testPool() throws ExecutionException, InterruptedException {
   ExecutorService threadPool = Executors.newFixedThreadPool(3);
   Future<Long> submit = threadPool.submit(new CallableDemo());
   Future<?> future = threadPool.submit(new RunnableDemo());
   System.out.println("callable结果"+submit.get());
   System.out.println("runnable结果"+future.get());

}

线程基本操作

方法简介
sleep休眠,只能自己醒来,不能从外部唤醒
interrupt如果此线程处于阻塞状态,立马推出阻塞抛出异常intereruptException,线程处理捕获此异常做处理,然后线程退出;如果此线程正在运行,线程不会受任何影响,继续运行,仅仅是线程的中断标记为true
jionA线程依赖B线程,B线程执行jion方法合并到A,等待B线程完成或超时,A线程处于等待状态
yied让目前正在执行的线程放弃当前操作,让出cpu权限,使cpu执行其他线程,不阻塞该线程,只是让线程转入就绪状态,等待cpu重新调度。
deamon实例属性daemon为布尔类型,默认为false表示为用户线程,实例方法setDaemon()此方法标记为守护线程或用户线程。

守护线程

守护线程也成为后台线程,专门在程序运行过程中在后台提供某种通用服务,守护线程和用户线程的本质区别是二者与jvm虚拟机进程终止的方向不同,用户线程和jvm进程是主动关系,如果用户线程全部终止,jvm虚拟机进程随之终止,守护线程和jvm进程是被动关系,如果jvm进程终止,守护线程随之终止。
守护线程必须在启动前将其状态设置为true,启动后不能将用户线程设置为守护线程,否则jvm抛出interruptedException异常。
守护线程存在被jvm强行终止的风险,所以尽量不去访问系统资源;
守护线程创建的线程也是守护线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值