java死锁、线程状态、线程通信、线程池

这篇具有很好参考价值的文章主要介绍了java死锁、线程状态、线程通信、线程池。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 回顾

  1. java实现多线程: [1]继承Thread类并重写run方法 [2]实现Runnable接口

  2. 线程Thread中常用的方法: setName(): Thread.currentThread().getName():

    ​ static void sleep(); static void yield(): join(): setDeamon()设置后台线程

    1. 线程安全问题: ---当多个线程共享同一个资源时,对该资源的操作就会出现线程安全问题。
    2. 手动锁 Lock它是一个接口--lock() unlock() <finally中>
    3. 自动锁synchronized

2. 正文

  1. 什么是死锁
  2. 线程都有哪些状态?
  3. 线程通信( 了解 wait 和sleep的区别)
  4. 线程池。

3. 什么是死锁

//死锁小案例
import java.util.concurrent.locks.ReentrantLock;


public class ccc {
    public static Object lock = new Object();
    public static Object lock2 = new Object();

}

public class eee extends Thread {
    @Override
    public void run() {
        synchronized (ccc.lock){
            System.out.println("aaa");
            synchronized (ccc.lock2){
                System.out.println("bbb");
            }
    }


}}


public class fff extends Thread{
	public void run(){
        synchronized (ccc.lock2){
            System.out.println("fff");
            synchronized (ccc.lock){
                System.out.println("e");
            }
        }

	}
}


public class ddd {
    public static void main(String[] args) throws InterruptedException {
        eee eee = new eee();
        fff fff = new fff();
        eee.start();
        Thread.sleep(100);
        fff.start();
    }
}

如何解决死锁: (1) 减少同步代码块的嵌套。 (2)设置锁的超时时间。(3)可以使用安全类-jdk提高的安全类。

4. 线程通信

notify():唤醒。

sleep和wait方法的区别?

(1) 来自不同的类: sleep来自于Thread, wait来自Object类。

(2) 是否释放锁资源: sleep不会释放锁资源。wait会释放锁资源。

(3) 用法: sleep时间到了自然会醒,而wait需要调用notify或notifyAll()方法唤醒。

notify和notifyAll()方法的区别?

1.notify随机唤醒等待队列中一个线程,而notifyAll会唤醒等待队列中所有的线程。

5. 线程的状态

NEW:新建状态
RUNNABLE: start()就绪状态-时间片-运行状态. 统称为RUNNABLE
BLOCKED: 堵塞状态。加锁时就如该状态
WAITING: 无期等待:  调用wait方法时会进入该状态
TIMED_WAITING: 有期等待---当调用sleep方法时就会进入该状态
TERMINATED: 终止状态。线程的任务代码执行完毕或出现异常。

线程的状态之间可以通过调用相应的方法,进行转换。

6. 线程池

线程池的原理:

线程池的创建文章来源地址https://www.toymoban.com/news/detail-649480.html

package demo08;

import java.util.concurrent.*;

/*
     Executor: 它是线程池的根接口:
         void execute(Runnable command):执行Runnable类型的任务。
     ExecutorService: 它是Executor的子接口。---
         void shutdown():关闭线程池。需要等任务执行完毕。
         shutdownNow(); 立即关闭线程池。 不在接受新的任务。
         isShutdown(): 判断是否执行了关闭。
         isTerminated(): 判断线程池是否终止。表示线程池中的任务都执行完毕,并且线程池关闭了
         submit(Callable<T> task);提交任务,可以提交Callable
         submit(Runnable task): 提交任务,可以提交Runnable任务

     Executors: 它是线程池的工具类,该类提供了创建线程池的一些静态方法
 */
public class Test {
    public static void main(String[] args) {
           //1.创建一个固定长度的线程池。
//        ExecutorService executorService = Executors.newFixedThreadPool(5);
        //2. 单一线程池。
//        ExecutorService executorService = Executors.newSingleThreadExecutor();
        //3. 可变线程池--缓存线程池
//        ExecutorService executorService = Executors.newCachedThreadPool();
        //4. 延迟线程池。
//        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);

//        for(int i=0;i<100;i++) {
//            executorService.submit(new Runnable() {
//                public void run() {
//                    System.out.println(Thread.currentThread().getName() + "~~~~~~~~~~~~~~~~~~~");
//                }
//            });
////            executorService.schedule(new Runnable() {
////                public void run() {
////                    System.out.println(Thread.currentThread().getName() + "~~~~~~~~~~~~~~~~~~~");
////                }
////            },10, TimeUnit.SECONDS);
//        }
//        executorService.shutdown();
        //上面通过Executors工具类创建线程池,但是阿里巴巴不建议使用。阿里建议使用原生的模式创建线程池。
        /*
                                int corePoolSize,核心线程的个数
                              int maximumPoolSize,最多的线程个数
                             long keepAliveTime, 线程空闲时间。
                              TimeUnit unit, 空闲的单位
                              BlockingQueue<Runnable> workQueue:等待队列
         */

        BlockingQueue<Runnable> workQueue=new ArrayBlockingQueue(5);//最多5等待的任务
        ThreadPoolExecutor executor=new ThreadPoolExecutor(5,10,10,TimeUnit.SECONDS,workQueue);
        //灵活:
        for(int i=0;i<25;i++){
            executor.submit(new Runnable() {
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~");
                }
            });
        }

    }
}

7. Callable创建线程

package demo09;

import demo03.My;

import java.util.concurrent.*;


public class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
//        MyCallable myCallable=new MyCallable();
//        FutureTask<Integer> task=new FutureTask<Integer>(myCallable);//把线程任务封装到该类中,该类可以获取线程任务执行后的结果.
//        Thread t=new Thread(task);
//        t.start();
//
//        System.out.println(task.get());
        //发现线程执行非常麻烦。都使用线程池来执行任务。---不要自己创建线程对象,而是使用线程池中的对象
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        Future<Integer> submit =executorService.submit(new MyCallable());
        System.out.println(submit.get());

    }
}
class MyCallable implements Callable<Integer>{

    //线程任务:
    public Integer call() throws Exception {
        int sum=0;
        for(int i=0;i<=10;i++){
            sum+=i;
        }
        return sum;
    }
}

class MyRunnable implements  Runnable{

    public void run() {

    }
}

到了这里,关于java死锁、线程状态、线程通信、线程池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java多线程编程中的线程死锁

    ​ 在多线程编程中,线程死锁是一种常见的问题,它发生在两个或多个线程互相等待对方释放资源的情况下,导致程序无法继续执行 。本文将介绍线程死锁的概念、产生原因、示例以及如何预防和解决线程死锁问题。 线程死锁的概念 ​ 线程死锁是指两个或多个线程被阻塞

    2024年02月12日
    浏览(37)
  • Java多线程【锁优化与死锁】

    我们延续上一篇博客进行锁优化的讲解 结合上一篇博客的锁策略, 我们就可以总结出, Synchronized 具有以下特性(只考虑 JDK 1.8): 我们根据上述锁策略可知synchronized锁基本特点 1.既是一个乐观锁也是悲观锁(根据锁竞争的的程度,自适应) 2.不是读写锁,只是一个互斥锁 3.既是一

    2023年04月16日
    浏览(37)
  • Java多线程(4)---死锁和Synchronized加锁流程

    目录 前言 一.synchronized 1.1概念  1.2Synchronized是什么锁? 1.3Synchronized加锁工作过程 1.4其他优化操作 二.死锁 2.1什么是死锁 2.2死锁的几个经典场景 2.3死锁产生的条件 2.4如何解决死锁 🎁个人主页:tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主 🎥 本文由 tq02 原创,首发于

    2024年02月13日
    浏览(40)
  • 【Java基础教程】(四十二)多线程篇 · 上:多进程与多线程、并发与并行的关系,多线程的实现方式、线程流转状态、常用操作方法解析~

    理解进程与线程的区别; 掌握Java 中多线程的两种实现方式及区别; 掌握线程的基本操作方法; 进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程 。多进程操作系统能同时运行多

    2024年02月16日
    浏览(48)
  • Java 线程状态详解

    当一个线程对象被创建,但还没有调用其start()方法时,它处于新建状态。(内核里还没创建对应PCB) 当线程的run()方法执行完毕或线程被强制终止时,线程进入终止状态。(表示内核中的PCB已经执行完毕,但是Thread对象还在) 当线程对象调用了start()方法后,线程进入就绪状态。有

    2024年02月12日
    浏览(44)
  • 【Java】线程的状态

    在之前的文章中,已经介绍了关于线程的基础知识。 我的主页: 🍆🍆🍆爱吃南瓜的北瓜 线程主要包括如下六种状态 在任意一个时间点,一个线程只能有且只有其中的一种状态,这6种状态分别如下: NEW: 安排了⼯作, 还未开始⾏动 创建后尚未启动的线程处于这种状态 RUNNA

    2024年04月14日
    浏览(26)
  • Java 线程的多种状态

    在前文中详细介绍了线程的启动、中断、休眠、等待。本文详细介绍线程的多种状态。 获取线程的当前状态代码是:   目录 前言 一、NEW 二、RUNNABLE 三、BLOCKED 四、WAITING 五、TIMED_WAITING 六、TERMINATED 结语   Thread 对象创建好了,但还没有调用start()方法。如:   就绪状态:1)

    2024年02月10日
    浏览(33)
  • Java多线程(1)---多线程认识、四种创建方式以及线程状态

    目录 前言 一.Java的多线程 1.1多线程的认识  1.2Java多线程的创建方式 1.3Java多线程的生命周期 1.4Java多线程的执行机制 二.创建多线程的四种方式 2.1继承Thread类 ⭐创建线程  ⭐Thread的构造方法和常见属性  2.2.实现Runnable接口 ⭐创建线程 ⭐使用lambda表达式创建 2.3实现Callable接口

    2024年02月14日
    浏览(43)
  • JavaEE初阶:Java线程的状态

    目录 获取当前线程引用 休眠当前线程  线程的状态 1.NEW               2.TERMINATED  3.RUNNABLE 4.WAITING 5.TIMED_WAITING 6.BLOCKED 多线程的意义 单线程  多线程 这个方法返回当前线程的引用。但是我们会对static有疑惑,这其实是一个静态方法,更好的说法是这是一个 类方法, 调用这

    2024年02月11日
    浏览(42)
  • Java多线程【状态与安全问题】

    线程状态 说明 NEW 安排了工作, 还未开始行动 RUNNABLE 可工作的. 又可以分成正在工作中和即将开始工作 BLOCKED 这几个都表示排队等着其他事情 WAITING 这几个都表示排队等着其他事情 TIMED_WAITING 这几个都表示排队等着其他事情 TERMINATED 工作完成了 1.NEW状态:安排了工作, 还未开始

    2023年04月09日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包