java第二十章总结多线程

news2024/11/17 5:54:29

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();
		
		
	}
 
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

纯干货篇,用Stable diffusion制作广告的保姆级教程

今天就想给大家演示一般如何使用Stable diffusion为你的产品添加场景&#xff0c;秒变广告大片。 掌握这个技能&#xff0c;你可以随意将产品添加不同的场景&#xff0c;节约复杂的拍摄布景和拍摄成本。 话不多说&#xff0c;接下来是详细讲解演示流程 首先选出一张你的产品图…

SAP_ABAP_编程基础_基本数据类型(预定义数据类型)介绍 , 它有10种

SAP ABAP 顾问&#xff08;开发工程师&#xff09;能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读441次。目标&#xff1a;基于对SAP abap 顾问能力模型的梳理&#xff0c;给一年左右经验的abaper 快速成长为三年经验提供超级燃料&#xff01;https://blog.csdn.net/j…

完美的输出打印 SQL 及执行时长[MyBatis-Plus系列]

导读 Hi,大家好,我是悟纤。过着爱谁谁的生活,活出不设限的人生。 在我们日常开发工作当中,避免不了查看当前程序所执行的SQL语句,以及了解它的执行时间,方便分析是否出现了慢SQL问题。 MyBatis-Plus提供了两种SQL分析打印的方式,用于输出每条SQL语句及其执行时间,针…

Redis应用的16个场景

常见的16种应用场景: 缓存、数据共享分布式、分布式锁、全局 ID、计数器、限流、位统计、购物车、用户消息时间线 timeline、消息队列、抽奖、点赞、签到、打卡、商品标签、商品筛选、用户关注、推荐模型、排行榜. 1、缓存 String类型 例如&#xff1a;热点数据缓存&#x…

【解决方案】多用户多回路宿舍用电管理解决方案

01 引言 近几年来&#xff0c;因违规使用大功率恶性负载电器导致宿舍失火的安全事故在各大高校时有发生&#xff0c;给学生和学校都带来了巨大的损失。北京大学、哈尔滨工业大学、上海商学院以及俄罗斯人民友谊大学等高校学生公寓发生的火灾给高校学生公寓的安全用电敲响了警钟…

视频封面:视频图片提取技巧,从指定时长中捕捉需求的图片

在当今的数字时代&#xff0c;视频已成为日常生活中不可或缺的一部分。无论是社交媒体、博客&#xff0c;视频都发挥着重要的作用。而一个吸引的视频封面往往能吸引更多的观众点击观看&#xff0c;选择清晰度高、色彩鲜艳且能吸引人的图片。同时&#xff0c;确保图片与视频内容…

【FMC139】青翼科技基于VITA57.1标准的4路500MSPS/1GSPS/1.25GSPS采样率14位AD采集FMC子卡模块

板卡概述 FMC139是一款基于VITA57.1标准规范的JESD204B接口FMC子卡模块&#xff0c;该模块可以实现4路14-bit、500MSPS/1GSPS ADC采集功能。该板卡ADC器件采用ADI公司的AD9680芯片,全功率-3dB模拟输入带宽可达2GHz。该ADC与FPGA的主机接口通过8通道的高速串行GTX收发器进行互联…

捷达EA113汽油机四缸汽车曲柄连杆机构毕业设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;捷达 获取完整论文报告工程源文件 本文以捷达EA113汽油机的相关参数作为参考&#xff0c;对四缸汽油机的曲柄连杆机构的主要零部件进行了结构设计计算&#xff0c;并对曲柄连杆机构进行了有关运动学和动力学的理论分析与计…

ESP32-Web-Server编程-JS 基础 1

ESP32-Web-Server编程-JS 基础 1 概述 前述分别在 HTML 基础 和 CSS 基础 中介绍了 HTML、CSS 的基本内容。HTML 定义了网页中包含哪些对象&#xff0c;CSS 定义了对象的显示样式。JavaScript(LiveScript)是一种运行于客户端的解释性脚本语言&#xff0c;使 HTML 页面更具动态…

Java第二十章多线程

线程简介 在 Java 中&#xff0c;并发机制非常重要。在以往的程序设计中&#xff0c;我们都是一个任务完成后再进行下一个任务&#xff0c;这样下一个任务的开始必须等待前一个任务的结束。Java 语言提供了并发机制&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每一…

Mysql的二阶段提交

先看执行器与InnoDB引擎是如何更新一条指定的数据的 可以看到&#xff0c;InnoDB在写redo log时&#xff0c;并不是一次性写完的&#xff0c;而有两个阶段&#xff0c;Prepare与Commit阶段&#xff0c;这就是"两阶段提交"的含义。 为什么要写redo log&#xff0c;不…

在虚拟机搭建nignx,和使用本地访问nginx的情况

下载nginx yum install nginx 查看nginx是否安装成功。 nginx -v nginx的配置文件的目录和资源的目录。 先到nginx.conf的目录下&#xff0c;在 /etc/nginx/nginx.conf&#xff0c;编辑它。 vi /etc/nginx/nginx.conf 可以看到默认的html的目录。在 /usr/share/nginx/html 下面…

滑块验证码之图片距离计算

滑块验证码之图片距离计算 1.使用工具 vscodepython3.8 2.安装opencv-python python -m pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com查看安装的版本&#xff1a; C:\Users\wenhz>pip list|findstr opencv opencv-pyt…

SRM供应商询价招投标管理系统

前言&#xff1a; 在当今高度信息化的时代&#xff0c;企业运营的效率和透明度对于企业的生存和发展至关重要。供应商管理系统&#xff08;SRM&#xff09;作为企业采购管理的重要工具&#xff0c;旨在提升企业与供应商之间的协作效率&#xff0c;优化采购流程&#xff0c;降低…

MySOL常见四种连接查询

1、内联接 &#xff08;典型的联接运算&#xff0c;使用像 或 <> 之类的比较运算符&#xff09;。包括相等联接和自然联接。 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如&#xff0c;检索 students和courses表中学生标识号相同的所有行。 2、…

U-Net及其变体在医学图像分割中的应用研究综述

U-Net及其变体在医学图像分割中的应用研究综述 论文来自&#xff1a;中国生物医学工程学报 2022 摘 要&#xff1a; 医学图像分割可以为临床诊疗和病理学研究提供可靠的依据&#xff0c;并能辅助医生对病人的病情做出准确的判断。 基于深度学习的分割网络的出现解决了传统自动分…

每日一练2023.11.28———【PTA】

题目链接&#xff1a; L1-009 N个数求和 题目要求&#xff1a; 本题的要求很简单&#xff0c;就是求N个数字的和。麻烦的是&#xff0c;这些数字是以有理数分子/分母的形式给出的&#xff0c;你输出的和也必须是有理数的形式。 输入格式&#xff1a; 输入第一行给出一个正整…

SpringBoot+Redis编写一个抢红包雨的案例。附源码。

案例演示 SpringBootRedis编写一个抢红包雨的案例。附源码 1、案例分析&#xff0c;整体方案介绍 预备上线一个红包雨活动。这个红包雨的思路是活动开始前25分钟&#xff0c;在后台创建活动。然后前端用户进入&#xff0c;到点后将设置的金额拆分成多个小红包&#xff0c;开启倒…

C++之STL库:string类(用法列举和总结)

前言 大家在学习STL库的时候一定要学会看英文文档&#xff0c;俗话说熟能生巧&#xff0c;所以还得多练&#xff01; 在使用string类之前&#xff0c;要包含头文件#include <string>和using namespace std; 文档链接&#xff1a;string - C Reference 一、string——构造…

【API 自动化测试】Eolink Apikit 图形用例详解

Eolink Apikit 的图形用例是指通过图形化的方式去表现 API 流程测试。它包括了条件选择器、单个 API 步骤和操作集等组件。 相较于前面推荐的表格化的通用用例&#xff0c;图形用例可以让测试人员更方便地设计和管理 API 流程测试&#xff0c;同时也更加的灵活。 添加图形用例…