当前位置: 首页 > news >正文

第二十章 多线程

20.2创建线程
20.2.1继承Thread类
Thread类是Java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建议Thread实例。

public class ThreadTest extedns Thread{}
run方法格式:

public void run(){}
20.1让线程循环打印1-10

20.2.2实现Runnable类
public class Tread extends Object implements Runnable

20.2让窗口的图标移动

20.4操作线程的方法
20.4.1线程的休眠
sleep方法  该时间以毫秒为单位

try{
Thread.sleep(2000);
}catch(InterruptedException e){
e.printStackTrace();
}
20.3每0.1秒绘制一条随机颜色的线条

20.4.2线程的加入
当某个线程使用join()方法加入另一个线程时,另一个线程会等待该线程执行完毕后再继续执行。

20.4让进度条A等待进度条B

20.4.3线程的中断
现在提倡run()方法中使用无限循环的形式,然后使用一个布尔型标记控制循环的停止。

20.5单机按钮停止进度条滚动

20.4.4线程的礼让
yield()方法使具有同样优先级的线程有进入可执行状态的机会,在当前线程放弃执行权会再回到就绪状态。

20.5线程的优先级
每个线程都具有各自的优先级,线程的优先级可以表明在程序中该线程的重要性,如果有会让你多线程处于就绪状态,系统会根据优先级来决定首先使用哪一个线程进入运行状态。

20.6观察不同优先级的线程执行完毕顺序

20.6线程同步
在单线程程序中,每一次只能做一件事情,后面的事情需要等待前面的事情完成后才可以进行,但是如果使用多线程线程,就会发生两个线程抢占资源问题。

20.6.1线程安全
20.6.2线程同步机制
1,同步块

synchronized(Object){
}
2,同步方法

synchronized void f(){}
20.7开发线程安全的火车售票系统
 


package lk;
 
public class Demo20_6_1 implements Runnable {
    int n=10;//设置当前总票数
    
    public  synchronized void du() {
        if(n>0) {//判断当前票数是否大于 0
            try {
                Thread.sleep(100);        //使当前线程休眠 100毫秒    
                }
        catch(InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"————票数"+n--);//票数减1
        }    
    }
    public void run() {
        while(true) {//设置无限循环
            du();
            
        }
    }
    
    
    public static void main(String[] args) {
        Demo20_6_1 t=new Demo20_6_1();//实例化类对象
        Thread tA=new Thread(t,"线程一");//以该类对象分别实例化 4 个线程
        Thread tB=new Thread(t,"线程二");
        Thread tC=new Thread(t,"线程三");
        Thread tD=new Thread(t,"线程四");
        tA.start();//分别启动线程
        tB.start();
        tC.start();
        tD.start();
        
        
    }
 


 

http://www.lryc.cn/news/248859.html

相关文章:

  • vue2使用npm依赖包导出xlsx文件
  • java--多态
  • 知识图谱06——将pdf中的表格(文字形式)保存至csv中
  • 一文教你使用Swagger---适合新手小白(结合实战)
  • VC++调试QT源码
  • 058-第三代软件开发-文件Model
  • 【领域驱动设计 学习目标及大纲】从CRUD到架构设计
  • asla四大开源组件应用示例(alsa-lib、alsa-utils、alsa-tools、alsa-plugins)
  • 文档理解的新时代:LayOutLM模型的全方位解读
  • 【二叉树】Leetcode 637. 二叉树的层平均值
  • 设计模式-15-Jdk源码中的设计模式
  • Vue框架学习笔记——事件scroll和wheel的区别
  • 【LeetCode】每日一题 2023_11_29 无限集中的最小数字(哈希/堆)
  • C/C++ 常用的四种查找算法
  • Linux | Ubuntu设置 netstat(网络状态)
  • 成为AI产品经理——模型构建流程(下)
  • TCP Socket API 讲解,以及回显服务器客户端的实现
  • 2023年掌控安全学院CTF暖冬杯——数据流分析
  • UE4 基础篇十四:自定义插件
  • QT QGraphicsItem 图元覆盖导致鼠标点击事件不能传递到被覆盖图元
  • proto语法学习笔记
  • python-nmap库使用教程(Nmap网络扫描器的Python接口)(功能:主机发现、端口扫描、操作系统识别等)
  • 什么是智慧工地?
  • 【古月居《ros入门21讲》学习笔记】08_发布者Publisher的编程实现
  • 沿着马可·波罗的足迹,看数字云南
  • 记录问题-使用@Validated报错Validation failed for argument [0]
  • three.js--立方体
  • App的测试,和传统软件测试有哪些区别?应该增加哪些方面的测试用例?
  • 改进LiteOS中物理内存分配算法(详细实验步骤+相关源码解读)
  • 洛谷100题DAY8