java第二十章总结多线程

20.2创建线程


20.2.1继承Thread类


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

public class ThreadTest extedns Thread{}


run方法格式:

public void run(){}

20.1让线程循环打印1-10

package lx;public class Demo20_1 extends Thread {public void run(){for(int i=0;i<=10;i++) {System.out.println(i+"");}}public static void main(String[] args) {Demo20_1 th=new Demo20_1();th.start();}}

 

20.2.2实现Runnable类 

public class Tread extends Object implements Runnable

 20.2让窗口的图标移动

package lx;import java.awt.Container;import javax.swing.JFrame;
import javax.swing.*;public class Demo20_2 extends JFrame {int c=0;//图标横坐标public Demo20_2() {setBounds(300,200,250,100);//绝对定位窗体大小和位置Container con=getContentPane();//主容器con.setLayout(null);//使窗体不使用任何布局管理器Icon img=new ImageIcon("src/1.gif");//图标对象JLabel jl=new JLabel(img);//显示图标的标签jl.setBounds(10, 10, 200, 50);//设置标签的位置和大小Thread t=new Thread() {//定义匿名线程对象public void run() {while(true) {jl.setBounds(c, 10, 200, 50);//将标签的横坐标用线程表示try {Thread.sleep(500);//使线程休眠500毫秒}catch(InterruptedException e) {e.printStackTrace();}c+=4;//使横坐标每次增加4if(c>=120) {c=10;//当图标到达标签最右边时,使其回到标签最左边}}}};t.start();//启动线程con.add(jl);//将标签添加到容器中setVisible(true);//使窗体可见setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗体的关闭方式}public static void main(String[] args) {new Demo20_2();}}

20.3线程的生命周期 

20.4操作线程的方法

20.4.1线程的休眠

sleep方法  该时间以毫秒为单位

  1.  
    try{
    Thread.sleep(2000);
    }catch(InterruptedException e){
    e.printStackTrace();
    }

    20.3每0.1秒绘制一条随机颜色的线条

  2. package lx;import java.awt.Color;
    import java.awt.Graphics;
    import java.util.Random;import javax.swing.JFrame;public class Demo20_3 extends JFrame {private static Color[]color= {//定义颜色数组Color.BLACK,Color.BLUE,Color.CYAN,Color.GREEN,Color.ORANGE,Color.YELLOW,Color.RED,Color.PINK,Color.LIGHT_GRAY};private static  final Random rand=new Random();//创建随机对象private static Color getC() {//获取随机颜色值的方法return color[rand.nextInt(color.length)];}public Demo20_3() {Thread t=new Thread(new Runnable() {//创建匿名线程对象int x=70;//定义初始坐标int y=50;public void run() {while(true) {//无限循环try {Thread.sleep(100);//线程休眠0.1秒}catch(InterruptedException e){e.printStackTrace();}Graphics g= getGraphics();//获取组件绘图上下文对象g.setColor(getC());//设置绘图颜色g.drawLine(x, y, 200, y++);//绘制直线并递增垂直坐标if(y>=100) {y=50;}}}});t.start();//启动线程}public static void main(String[] args) {init(new Demo20_3(),300,100);}public static void init(JFrame f,int w,int h) {//初始化程序界面的方法f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setSize(w, h);f.setVisible(true);}
    }

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

  4. package lx;import java.awt.BorderLayout;import javax.swing.*;public class Demo20_4 extends JFrame{private Thread A;//定义两个线程private Thread B;private JProgressBar Bar=new JProgressBar();//定义两个进度条组件private JProgressBar Bar2=new JProgressBar();public static void main(String[] args) {Demo20_4 Text=new Demo20_4();Text.setVisible(true);}public Demo20_4() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(200,200,200,100);getContentPane().add(Bar,BorderLayout.NORTH);//将进度条设置在窗体最北面getContentPane().add(Bar2,BorderLayout.SOUTH);//将进度条设置在窗体最南面Bar.setStringPainted(true);//设置进度条显示数字字符Bar2.setStringPainted(true);A=new Thread(new Runnable() {//使用匿名内部类形式初始化Thread实例int c=0;public void run() {//重写润()方法while(true) {Bar.setValue(c++);//设置进度条当前值try {Thread.sleep(100);//让A线程休眠100毫秒B.join();//让/B调用join()方法if(c==30)//设置当A线程走到了30,B线程才启动B.start();//启动B线程}catch(InterruptedException e) {e.printStackTrace();}}}});A.start();//启动A线程B=new Thread(new Runnable() {int c=0;public void run() {while(true) {Bar2.setValue(++c);//设置进度条当前值try {Thread.sleep(100);//让B线程休眠100毫秒}catch(InterruptedException e) {e.printStackTrace();}if(c==100)//当c变量增长为100时break;			//跳出循环	}}});}}

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

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

  6. package lk;import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JProgressBar;public class Demo20_5 extends JFrame{public Demo20_5(){JProgressBar Bar=new JProgressBar();//创建进度条getContentPane().add(Bar,BorderLayout.NORTH);//将进度条设置在窗体最北面JButton b=new JButton("停止");getContentPane().add(b,BorderLayout.SOUTH);//将进度条设置在窗体最南面Bar.setStringPainted(true);//设置进度条显示数字字符Thread t=new Thread(new Runnable() {int c=0;public void run() {while(true) {Bar.setValue(++c);//设置进度条当前值try {Thread.sleep(100);//让A线程休眠100毫秒}catch(InterruptedException e) {//捕捉InterruptedException异常System.out.println("当前线程程序被中断");break;}}}});b.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {t.interrupt();//中断线程}});t.start();//启动线程}public static void init(JFrame frame,int w,int h) {frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(w, h);frame.setVisible(true);}public static void main(String[] args) {init(new Demo20_5(),100,100);}}

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

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

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

  9. package lk;public class Demo20_6 implements Runnable{String name;public 	Demo20_6(String name) {this.name=name;}public void run() {String tmp="";for(int i=0;i<50000;i++) {//完成5万次字符串拼接tmp+=i;}System.out.println(name+"线程完成任务");}public static void main(String[] args) {Thread a=new Thread(new Demo20_6("A"));//A线程优先级最小a.setPriority(1);Thread b=new Thread(new Demo20_6("B"));b.setPriority(3);Thread c=new Thread(new Demo20_6("C"));c.setPriority(7);Thread d=new Thread(new Demo20_6("D"));//D线程优先级最大d.setPriority(10);a.start();b.start();c.start();d.start();//线程的执行顺序由CPU决定,所有可能不一定按优先级排序}}

    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) {//判断当前票数是否大于 0try {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.hqwc.cn/news/225850.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动

文章目录 前言一、输入系统的基本组成部分二、输入系统相关源码分析1、IMS 构建1.1、SystemServer # startOtherServices()1.2、InputManagerService1.3、NativeInputManager # nativeInit()1.4、NativeInputManager1.5、InputManager1.6、InputDispatcher1.7、InputReader1.8、…

实战Flask+BootstrapTable最实用服务端分页查询动态表头及数据(ajax方式)

看到这篇文章的朋友们是幸运的,我用了很久才实战出如下结果,且行且珍惜,祝好! 话不多说,有图有源码 1.看图,实现服务端动态表头数据,分页,查询,排序 1.数据准备 CREATE TABLE goods (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL COMMENT 商品名,no …

mac电脑下载Netflix Mac(奈飞客户端)安装教程

Netflix Mac&#xff0c;奈飞官方客户端&#xff0c;带给您无限的电影和剧集体验&#xff01;与朋友分享最新热门剧集、电影&#xff0c;与家人一起享受高品质的流媒体内容。 通过Netflix Mac&#xff0c;您可以轻松地搜索、浏览和观看各种类型的影片&#xff0c;包括剧情片、…

Photoshop Elements 2023 v21.0(ps简化版)

Photoshop Elements 2023是一款ps简化版图像处理软件&#xff0c;它加入了一些新的功能和工具&#xff0c;以帮助用户更高效地处理图片。 新功能&#xff1a;软件加入了黑科技&#xff0c;采用Adobe Sensei AI技术&#xff0c;主打人工智能&#xff0c;一键P图&#xff0c;新增…

使用Python进行帧提取及指定帧插入实现文本隐写(CTF杂项出题方向)

视频是由一系列连续的图像帧组成的&#xff0c;每一帧都是视频的静止画面。这些帧以一定的速率播放&#xff0c;就形成了运动的视频。以下是视频帧的一些基本概念&#xff1a; 帧率&#xff08;Frame Rate&#xff09;&#xff1a; 帧率表示每秒播放的图像帧数量。通常以“帧/秒…

c语言,输入整数n(行数,本例为4),按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16

c语言&#xff0c;输入整数n(行数&#xff0c;本例为4&#xff09;&#xff0c;按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 以下是使用C语言编写的程序&#xff0c;根据输入的行数打印数字图片的规则&#xff1a; #include <stdio.h>int main() …

[SaaS] 广告创意中stable-diffusion的应用

深度对谈&#xff1a;广告创意领域中 AIGC 的应用这个领域非常快速发展&#xff0c;所以你应该保持好奇心&#xff0c;不断尝试新事物&#xff0c;不断挑战自己。https://mp.weixin.qq.com/s/ux9iEABNois3y4wwyaDzAQ我对AIGC领域应用调研&#xff0c;除了MaaS服务之外&#xff…

事务的自动提交机制和隐式提交机制

自动提交机制就是一个sql语句完成默认提交一次&#xff0c;也就是说一个sql语句是原子性的。想关闭这种功能&#xff0c;两种方式一种写START TRANSACTION&#xff0c;另一种SET autocommit OFF 隐式提交机制&#xff0c;在START TRANSACTION后&#xff0c;会有一些情况导致语…

【刷题笔记】分糖果||数组||暴力通过||符合思维方式||多案例分析

分发糖果 文章目录 分发糖果1 题目描述2 题目分析2.1 寻找波峰波谷2.2 从波底往波峰攀爬&#xff01;2.2 计算糖果 3 代码附录1 1 题目描述 https://leetcode.cn/problems/candy/ n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&…

数据导入与预处理-第7章-数据清理工具OpenRefine

文章目录 数据清理工具OpenRefineOpenRefine简介下载与安装配置创建项目操作列收起列移动列和重排列移除该列与移除列重新定义列标题撤销与重做导出数据 进阶操作数据排序数据归类重复检测数据填充文本过滤数据转换 总结 数据清理工具OpenRefine OpenRefine简介 OpenRefine是…

NX二次开发UF_MTX3_x_vec 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_MTX3_x_vec Defined in: uf_mtx.h void UF_MTX3_x_vec(const double mtx [ 9 ] , double x_vec [ 3 ] ) overview 概述 Returns the X-direction vector of a matrix. 返回矩阵…

图片照片编辑SDK解决方案

图像和照片已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是个人还是企业&#xff0c;都希望通过高质量的图像和照片来提升品牌形象&#xff0c;吸引更多的用户和客户。然而&#xff0c;图像和照片的编辑并不是一件简单的事情&#xff0c;它需要专业的技术和工具。这…