首页 > 编程语言 >java死锁、线程状态、线程通信、线程池

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

时间:2023-08-15 21:22:14浏览次数:52  
标签:java Thread void 死锁 线程 new public sleep

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. 什么是死锁

1692080817566

//死锁小案例
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. 线程通信

1692082465214

1692082488273

notify():唤醒。

1692082711832

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. 线程池

1692086987517

线程池的原理:

1692087158587

线程池的创建

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,Thread,void,死锁,线程,new,public,sleep
From: https://www.cnblogs.com/226zjw/p/17632471.html

相关文章

  • ubuntu18从java8更新到java11
    先安装java11,再更新软连接sudoaptupdatesudoaptinstall-yopenjdk-11-jdk1.checkjava$whichjava/usr/bin/java$ls-lrt/usr/bin/javalrwxrwxrwx1rootroot22Aug312021/usr/bin/java->/etc/alternatives/java$ls-lrt/etc/alternatives/javalr......
  • JavaScript基础:学习JavaScript语言的基本语法和常用操作,了解网页交互的基本原理
    JavaScript是一种广泛应用于网页开发中的脚本语言,它可以与HTML和CSS一起使用,实现网页交互及动态效果。以下是JavaScript的基本语法和常用操作:变量声明:使用var、let或const关键字声明变量。varname="John";letage=25;constPI=3.14;数据类型:包括字符串、数字、布......
  • java的异常处理机制
    Java的异常处理机制是一种用于处理程序运行中出现的异常情况的机制。当程序发生异常时,如果没有适当地处理异常,程序可能会终止或导致不可预测的结果。Java的异常处理机制提供了一种结构化的方式来捕获和处理异常,以便程序可以优雅地处理异常情况。Java的异常处理机制基于以下几个关......
  • 《深入理解Java虚拟机》读书笔记:Class类文件的结构
    Class类文件的结构 Sun公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的的程序存储格式——字节码(ByteCode),从而实现了程序的......
  • 【Java】从头开始的Java复健day7
    用的书:《Java从入门到精通》day1(3.1-3.3):【Java】从头开始的Java复健day1day2(3.4-3.8):【Java】从头开始的Java复健day2day3(4.1-4.4):【Java】从头开始的Java复健day3day4(4.5-5.2):【Java】从头开始的Java复健day4day5(5.3-5.4):【Java】从头开始的Java复健day5da......
  • 【校招VIP】java语言考点之ConcurrentHashMap1.7和1.8
    考点介绍:ConcurrentHashMap是JAVA校招面试的热门考点,主要集中在1.7和1.8的底层结构和相关的性能提高。理解这个考点要从map本身的并发问题出发,再到hashTable的低性能并发安全,引申到ConcurrentHashMap的分块处理。同时要理解读锁和写锁的区别一、考点题目1、ConcurrentHashMap与......
  • 《Java编程思想第四版》学习笔记13
    //:Frog.java//TestingfinalizewithinheritanceclassDoBaseFinalization{publicstaticbooleanflag=false;}classCharacteristic{Strings;Characteristic(Stringc){s=c;out.println("Creating......
  • JavaScript 如何封装一些常见的函数来提高工作效率
    前言为什么要封装函数JavaScript封装函数的主要目的是为了保护代码的安全性和可维护性。封装可以隐藏实现细节:将函数内部的实现细节封装起来,只暴露给外部必要的接口,可以使代码更加安全,防止意外修改或者滥用。封装可以提高代码的可维护性:将功能模块封装成函数,可以使代码更加模......
  • Java学习笔记(十)
    第7章 面向对象(下)7.1 静态的1、static:静态的2、什么是静态的?和对象无关的,不会因为对象的不同而不同,即所有对象都一样的。换句话说,和对象无关。动态的,根据对象的不同而不同,和对象有关,由对象动态决定。3、static这个关键字用在哪里?(1)成员变量前面:静态变量(2)成员方法前面:静态......
  • 怎样快速学好Java?
    怎样才能快速学好Java编程,快速接手项目开发?给大家分享6点学习经验: 1、书籍是最好的知识载体,也是进阶Java编程大神的必须工具,一定要看书 现在学习Java变得比以前容易多了,然而我要说的是,Java虽然变得越来越容易学,然而那只代表入门容易,并不代表这门编程技术就真的变简单了。如果仅仅......