「java线程await」Java线程中断

博主:adminadmin 2023-03-18 10:41:07 554

本篇文章给大家谈谈java线程await,以及Java线程中断对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java线程的几种状态

总结了6种状态,希望对你所有帮助:

1、NEW 状态是指线程刚创建, 尚未启动

2、RUNNABLE 状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等

3、BLOCKED  这个状态下, 是在多个线程有同步操作的场景, 比如正在等待另一个线程的synchronized 块的执行释放, 或者可重入的 synchronized块里别人调用wait() 方法, 也就是这里是线程在等待进入临界区

4、WAITING  这个状态下是指线程拥有了某个锁之后, 调用了他的wait方法, 等待其他线程/锁拥有者调用 notify / notifyAll 一遍该线程可以继续下一步操作, 这里要区分 BLOCKED 和 WATING 的区别, 一个是在临界点外面等待进入, 一个是在临界点里面wait等待别人notify, 线程调用了join方法 join了另外的线程的时候, 也会进入WAITING状态, 等待被他join的线程执行结束

5、TIMED_WAITING  这个状态就是有限的(时间限制)的WAITING, 一般出现在调用wait(long), join(long)等情况下, 另外一个线程sleep后, 也会进入TIMED_WAITING状态

6、TERMINATED 这个状态下表示 该线程的run方法已经执行完毕了, 基本上就等于死亡了(当时如果线程被持久持有, 可能不会被回收)

Java多线程中await和wait的区别

await是Condition里面的...其实跟wait差不多,只不过wait是Object里面的,所有类都继承了它,所以改了个名字而已;

二〇一七年八月十七日 16:49:49

求大神,java多线程中,await与wait的具体区别在哪?

其实await和wait的用法差不多。await是wait改进过来,现在开发一多半都用await,因为await加入了lock方法

Lock

替代了

synchronized

方法和语句的使用

java await是什么

await是wait改进来的,用法没多大区别

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

java 如何实现等待子线程结束

有多种实现方式,下面列出两种。

第一种:实现Callable类,使用有返回值的线程,只有线程执行完成后才会返回结果。

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.concurrent.*;

public class Main {

    // 初始化一个容量为10的线程池

    static final ExecutorService pool = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        ListFutureString futures = new ArrayList();

        for (int i = 0; i  3; i++) {

            MyThread thread = new MyThread("线程" + i);

            futures.add(pool.submit(thread));

        }

        for (FutureString future : futures) {

            String name = future.get();

            System.out.println(name + "执行完成...");

        }

        System.out.println("所有线程执行完成!");

    }

}

class MyThread implements CallableString {

    private String name;

    public MyThread(String name) {

        this.name = name;

    }

    @Override

    public String call() throws Exception {

        // TODO 执行业务

        // 随机延迟,模拟线程耗时

        Thread.sleep(1000 + new Random().nextInt(2000));

        return name;

    }

}

第二种:使用CountDownLatch实现线程计数,代码如下:

import java.util.Random;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class Main2 {

    // 初始化一个容量为10的线程池

    static final ExecutorService pool = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws InterruptedException {

        int threadCount = 3;

        // 初始化CountDownLatch,用于线程计数

        CountDownLatch latch = new CountDownLatch(threadCount);

        for (int i = 0; i  threadCount; i++) {

            MyThread thread = new MyThread("线程" + i, latch);

            pool.execute(thread);

        }

        // 阻塞当前线程,CountDownLatch计数减为0时表示所有线程都执行完毕,才会释放主线程的阻塞

        latch.await();

        System.out.println("所有线程执行完成!");

    }

}

class MyThread implements Runnable {

    private String name;

    private CountDownLatch latch;

    public MyThread(String name, CountDownLatch latch) {

        this.name = name;

        this.latch = latch;

    }

    @Override

    public void run() {

        // TODO 执行业务

        // 随机延迟,模拟线程耗时

        try {

            Thread.sleep(1000 + new Random().nextInt(2000));

        } catch (InterruptedException e) {

        }

        // 计数减一

        latch.countDown();

        System.out.println(name + "执行完毕...");

    }

}

关于java线程await和Java线程中断的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。