首页 > 编程语言 >java多线程知识点总结

java多线程知识点总结

时间:2023-01-08 11:33:07浏览次数:36  
标签:知识点 java Thread lock 线程 Desk new 多线程 public


一、线程的三种创建方法

1-1 继承Thread

继承thread方法然后重写run方法,在用start开启线程。

代码实现:

Thread t = new Thread(){
            @Override
            public void run() {
                
            }
        };
        
        t.start();

1-2 实现Runnable接口(主要用于做共享任务)

实现Runnable接口重写run方法,将实现类的对象当参数传入创建Thread。

代码实现:

Thread t = new Thread(new Runnable() {
            public void run() {
                
            }
        });
        t.start();

1-3 实现Callable接口(用于获得线程任务的返回值配合FutureTask使用)

先实现Callable接口重写call方法,新建FutureTask将Callable的实现类当作参数传入,在创建Thread将FutureTask传入。FutureTask可以获得返回值。

代码实现:

FutureTask<String> stringFutureTask = new FutureTask<String>(new Callable<String>() {
            public String call() throws Exception {
                return "success";
            }
        });
        Thread t2 = new Thread(stringFutureTask);
        t2.start();
        String s = stringFutureTask.get();
        System.out.println(s);

1-4 线程的常用方法

设置线程优先级(提高概率,本质还是随机)范围1 - 10;

setPriority(int newPriority);

设置守护线程

setDaemon(true);

获取当前线程

Thread.currentThread();

二、创建线程池的俩种方法

1-1 Executors

创建默认线程池

Executors.newCachedThreadPool();

创建最大线程线程池

Executors.newFixedThreadPool(10);

1-2 ThreadPoolExecutors

构造方法

​编辑

三、线程安全的三种方法

1-1 同步代码块

synchronized(锁对象){

}

1-2 同步代码方法

修饰符 synchronized 返回值类型 方法名(方法参数) { 
    方法体;
}

1-3 Lock对象

Lock lock = new Lock();

lock.lock();

lock.unlock();

四、线程的生命周期

​编辑

 

五、消费者跟生产者

消费者:消费数据

生产者:生产数据

六、例题


public class ThreadDemo {
    public static void main(String[] args) {
        Cooker cooker = new Cooker();
        cooker.start();
        Footer footer = new Footer();
        footer.start();
    }
}

class Desk {

    public static boolean flag = false;

    public static final Object lock = new Object();

}

class Cooker extends Thread {

    @Override
    public void run() {
        int count = 0;
        while (true) {
            synchronized (Desk.lock) {
                if (!Desk.flag) {
                    System.out.println("生成了一个汉堡包");
                    Desk.flag = true;
                    Desk.lock.notifyAll();
                    count++;
                    if (count == 5) break;
                } else {
                    try {
                        Desk.lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

class Footer extends Thread {

    @Override
    public void run() {
        while (true) {
            synchronized (Desk.lock) {
                if (Desk.flag) {
                    System.out.println("吃了一个汉堡包");
                    Desk.flag = false;
                    Desk.lock.notifyAll();
                } else {
                    try {
                        Desk.lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

运行结果:

​编辑


标签:知识点,java,Thread,lock,线程,Desk,new,多线程,public
From: https://www.cnblogs.com/suwejie/p/17034324.html

相关文章

  • java弹幕视频网站源码
    简介Java基于ssm的弹幕视频系统,用户注册后可以上传视频进行投稿,也可以浏览视频发送弹幕,在个人中心管理视频、管理弹幕、管理评论等。管理员可以管理视频弹幕评论,查看统计......
  • java食堂库存管理系统源码
    简介Java基于sprinboot开发的食堂库存管理系统,用于统计食堂库存的,包含采购、入库、出库、折损等功能。演示视频https://www.bilibili.com/video/BV1Jf4y1C7vq/?share_s......
  • java基于ssm空气质量检测系统源码网站空气质量监测源码
    简介Java基于ssm的空气质量检测系统,检测设备检测一定范围内的企业空气指数,如果有污染则地图显示红色标记。演示视频https://www.bilibili.com/video/BV1GK4y1W7JB/?shar......
  • C++ - 多线程
    1.多线程传统的C++(C++11之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthread.h>,或者windows下......
  • Snmp网络协议及Java开发相关
    主要包:snmp4j  完整demo:​​http://avery-leo.iteye.com/blog/213980​​  课件​​https://wenku.baidu.com/view/3862136127d3240c8447ef19.html​​ ......
  • 为什么 java 容器推荐使用 ExitOnOutOfMemoryError 而非 HeapDumpOnOutOfMemoryError
    前言好久没写文章了,今天之所以突然心血来潮,是因为昨天出现了这样一个情况:我们公司的某个手机APP后端的用户(customer)微服务出现内存泄露,导致OutOfMemoryError,但......
  • 多线程的事务回滚问题
    多线程的事务回滚问题环境要求1.mybatis-plus或mybatis2.支持单表的增删改查3.书写工具类将集合平分,获取线程池importjava.util.ArrayList;importjava.util.List;......
  • java环境搭建
    Day2-jdk下载(8u201免费)下载地址https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html安装地址    安装完后设置系统变量如下四......
  • 使用 JavaScript 创建一个兔年春节倒数计时器
    我们可以通过多种方式构建JavaScript倒数计时,我在本教程中展示的这个​​兔年春节倒数计时器​​是由HTMLCSS和JavaScript创建的。它的工作方式非常简单,需要两种类......
  • 30 lambda表达式 知识点
    //无参无返回值Actionat=()=>{Console.WriteLine("无参无返回");};at.Invoke();//有参无返回值Action<int>st1=(intvalue)=>{......