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;//使横坐标每次增加4
					if(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) {//判断当前票数是否大于 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();
		
		
	}
 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/195728.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言--根据成绩判断等级

一.题目描述 如果学生的成绩小于60分&#xff0c;那么输出不及格 如果学生的成绩大于60分小于85分&#xff0c;那么输出良好 如果学生的成绩大于85分&#xff0c;那么输出优秀 二.代码实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> //根据成绩打印等级 //scor…

06-学成在线添加课程,包含课程基本信息,营销信息,课程计划信息,师资信息

添加课程基本/营销/计划信息 界面原型 第一步: 用户进入课程查询列表,点击添加课程按钮,选择课程类型是直播还是录播,课程类型不同那么授课方式也不同 添加的课程和教学机构是一对一的关系 第二步: 用户选完课程形式后,点击下一步填写课程的基本信息和营销信息(两张表) 用户…

在Visual Studio Code中安装加速TypeScript程序开发的插件

在Visual Studio Code中安装加速TypeScript程序开发的插件 Install Extensions on Visual Studio Code for TypeScript Application Development By Jackson 2023-11-28 众所周知&#xff0c;微软的Visual Studio Code是一款轻量级、功能强大的集成开发环境。它支持各种编程语…

ESXi 添加虚拟闪存 无可选设备问题排查

虚拟内存是计算机系统中的一种技术&#xff0c;它可以将计算机硬盘的一部分空间作为临时存储器来使用。当计算机的物理内存&#xff08;RAM&#xff09;不足时&#xff0c;操作系统可以将部分数据从内存移至硬盘的虚拟内存空间中&#xff0c;以释放内存供其他程序使用。虚拟内存…

双通道 12V 直流电机驱动芯片GC8548,可替代LV8548/LV8549/ONSEMI,内置 LDO,不需要逻辑电源,输入 兼容 3.3V 与 5V

GC8548 是一款双通道 12V 直流电机驱动芯 片&#xff0c;为摄像机、消费类产品、玩具和其他低压或 者电池供电的运动控制类应用提供了集成的电机 驱动解决方案。芯片一般用来驱动两个直流电机 或者驱动一个步进电机。 它可以工作在 3.8~12V 的电源电压上&#xff0c; 每通道能提…

全能音乐制作环境——水果编曲软件FL Studio 21.1版本下载安装配置

目录 前言一、FL Studio 安装二、使用配置总结 前言 FL Studio是一款流行的图像线软件制作和编辑音频文件。作为一款领先的创新产品&#xff0c;该软件能够满足在创作音乐方面的需求。有了这个产品&#xff0c;可以完成制作音乐的整个过程。可以使用这个软件进行写作&#xff…

Ubuntu新手使用教程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Net6.0或Net7.0项目升级到Net8.0 并 消除.Net8中SqlSugar的警告

本文基于NetCore3.1或Net6.0项目升级到Net7.0&#xff0c;参考连接&#xff1a;NetCore3.1或Net6.0项目升级到Net7.0-CSDN博客 所有项目按照此步骤操作一遍&#xff0c;完成后再将所有引用的包&#xff08;即 *.dll&#xff09;更新升级到最新版&#xff08;注意&#xff1a;有…

【软件测试面试】项目经验回答+面试技巧和方法汇总...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试面试时问你…

如何设置带有密码的excel只读模式?

Excel只读模式大家都不陌生&#xff0c;那大家知道带有密码的只读模式吗&#xff1f;今天给大家分享如何设置带有密码的只读模式。 打开excel文件&#xff0c;将文件进行【另存为】设置&#xff0c;然后停留在保存路径的界面中&#xff0c;我们点击下面的工具 – 常规选项 在常…

人机交互3——多主题多轮对话

1.主动切换 2.被动切换 3.多轮状态记忆

城市内涝积水监测系统,全方位监测城市内涝

在城市规划与防灾减灾的领域中&#xff0c;城市内涝积水监测系统的构建至关重要。随着城市化进程的加快&#xff0c;城市内涝问题日益凸显&#xff0c;对市民的生活质量和生命财产安全构成威胁。为了应对这一问题&#xff0c;建设一套高效、精准的城市内涝积水监测系统势在必行…

【开发实践】网页预览excel表格原版样式

一、需求分析 由于业务部门需要&#xff0c;在导出excel表格页面&#xff0c;不需要先下载&#xff0c;就可以直接在页面上预览该表格文件。 二、代码实现 使用Luckysheet实现&#xff1a; 什么是Luckysheet Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0…

【已解决】AttributeError: module ‘matplotlib‘ has no attribute ‘imshow‘

首先 在学习OpenCV的第一个程序&#xff0c;碰到这个问题记录一下。首先我已经安装好了matplotlib 如下图&#xff1a; 所以可以排除的就是我已经具备了这个库&#xff0c;那就是我在调用的时候出现的问题。 其次 回到pycharm&#xff0c;检查一下代码并做出如下的修改。 …

el-table,列表合并,根据名称列名称相同的品名讲其它列值相同的进行合并

el-table,列表合并,根据名称列名称相同的品名讲其它列值相同的进行合并,并且不能垮品名合并 如图 用到el-table合并行的方法合并 tableSpanMethod({ row, column, rowIndex, columnIndex }) {if (column.property "materielName") {//合并商品名const _row this…

数据可视化:在Jupyter中使用Matplotlib绘制常用图表

Matplotlib是一个强大的数据可视化库&#xff0c;用于创建各种图表。 在Jupyter中使用Matplotlib可以轻松实现折线图、柱状图、散点图和饼图等常用图表。 本篇文章将为你详细讲解用matlpotlib绘制常用图表的方法。 1、折线图 折线图是展示数据趋势和变化的常见图表类型。 …

从零带你底层实现unordered_map (2)

&#x1f4af; 博客内容&#xff1a;从零带你实现unordered_map &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准C后端工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家…

8 有损压缩的.jpg图片文件格式详解,解封装拆包

有损压缩的.jpg文件 作者将狼才鲸创建日期2023-11-28 1&#xff09;简述 JPEG文件描述 JPEG协议格式分为JPEG、渐进式JPEG&#xff08;图片先显示一部分再显示全部&#xff09;、JPEG2000&#xff08;压缩品质更好&#xff0c;压缩率更高&#xff09;压缩模式&#xff1a;顺序…

如何进行无代码开发?有哪些无代码开发工具和无代码软件开发平台?

无代码开发是指不写代码&#xff0c;通过可视化工具进行应用程序开发。无代码开发让非技术用户通过拖拽和选择等简单操作&#xff0c;就能快速创建应用程序。 如何学习无代码开发 随着科技的不断发展&#xff0c;新的技术和工具不断涌现&#xff0c;无代码开发就是其中一种。掌…

C#中的async/await异步编程模型

前言 当谈到异步编程时&#xff0c;C#中的async/await是一个强大且方便的工具。它使得编写并发和异步操作变得更加简单和可读&#xff0c;同时提供良好的可维护性。本文将详细解释async/await的使用&#xff0c;以及如何在C#中有效地利用它来实现异步操作。 目录 前言1. async…