Java线程学习_Faith-小浩浩的博客-程序员宅基地

技术标签: java  

1.创建线程的三种方式

	1)继承Thread类,重写run方法
	2)实现Runnable接口
	3)实现Callable接口

1.1继承Thread类

public class MyThread extends Thread{
    
	@Override
	public void run() {
    
		for (int i = 0; i <100; i++) {
    
			System.out.println("子线程............"+i);
		}
	}

}

public class TestThread {
    
	public static void main(String[] args) {
    
		//1.创建线程对象
		MyThread myThread = new MyThread();
		
		//2.启动线程类
		myThread.start();
		
		//3.打印主线程
		for (int i = 0; i < 50; i++) {
    
			System.out.println("主线程========="+i);
		}
	}
}

如下面的第4步执行的结果会出现重复的,你该怎么办?

public class TestThread {
    
	public static void main(String[] args) {
    
		//1.创建线程对象
		MyThread myThread = new MyThread();
		
		//2.启动线程类
		myThread.start();
		
		//4.创建线程对象2
		MyThread myThread2 = new MyThread();
		myThread2.start();
		
		
		//3.打印主线程
		for (int i = 0; i < 50; i++) {
    
			System.out.println("主线程========="+i);
		}
	}
}

问题答案解决

获取线程ID和线程名称
1.)在Thread的子类中调用this.getId()或this.getName()
2.)使用Thread.currentThread.getId()和Thread.currentThread.getName()
修改线程名称
1.调用线程对象的setName()方法
2.使用线程子类的构造方法赋值

public class MyThread extends Thread{
    
	@Override
	public void run() {
    
		for (int i = 0; i <100; i++) {
    
			System.out.println("线程ID:"+this.getId()+"线程名称:"+this.getName()+"子线程............"+i);
		}
	}

}

第二种方式

public class MyThread extends Thread{
    
	@Override
	public void run() {
    
		for (int i = 0; i <100; i++) {
    
			System.out.println("线程ID:"+Thread.currentThread().getId()+"线程名称:"+Thread.currentThread().getName()+"子线程..........."+i);
		}
	}

}

修改线程名称

方式1:

public class TestThread {
    
	public static void main(String[] args) {
    
		//1.创建线程对象
		MyThread myThread = new MyThread();
		
		//2.启动线程类
		//5.修改线程名称(在启动之类修改)
		myThread.setName("我是子线程1");
		myThread.start();
		
		//4.创建线程对象2
		MyThread myThread2 = new MyThread();
		
		myThread2.setName("我是子线程2");
		myThread2.start();
		
		
		//3.打印主线程
		for (int i = 0; i < 50; i++) {
    
			System.out.println("主线程========="+i);
		}
	}
}

方式2:

public class MyThread extends Thread{
    
	
	public MyThread() {
    
		// TODO Auto-generated constructor stub
	}
	public MyThread(String name) {
    
		super(name);
	}
	
	
	@Override
	public void run() {
    
		for (int i = 0; i <100; i++) {
    
			//System.out.println("线程ID:"+this.getId()+"线程名称:"+this.getName()+"子线程............"+i);
			System.out.println("线程ID:"+Thread.currentThread().getId()+"线程名称:"+Thread.currentThread().getName()+"子线程..........."+i);
		}
	}

}

public class TestThread {
    
	public static void main(String[] args) {
    
		//1.创建线程对象
		MyThread myThread = new MyThread("我是子线程1");
		
		//2.启动线程类
		//5.修改线程名称(在启动之类修改)
		//myThread.setName("我是子线程1");
		myThread.start();
		
		//4.创建线程对象2
		MyThread myThread2 = new MyThread("我是子线程2");
		
		//myThread2.setName("我是子线程2");
		myThread2.start();
		
		
		//3.打印主线程
		for (int i = 0; i < 50; i++) {
    
			System.out.println("主线程========="+i);
		}
	}
}

案例:卖票问题

/**
 * 卖票窗口类
 * @author DELL
 *
 */
public class TicketWin extends Thread{
    
	
	public TicketWin() {
    
		// TODO Auto-generated constructor stub
	}
	
	public TicketWin(String name) {
    
		super(name);
	}
	
	
	private int ticket=100;//票
	
	@Override
	public void run() {
    
		//卖票功能
		while(true) {
    
			if(ticket <=0 ) {
    
				break;
			}
			System.out.println(Thread.currentThread().getName()+"卖出第"+ticket+"张");
			ticket--;
		}
	}

public class TestticketWin {
    
	public static void main(String[] args) {
    
		//创建四个卖票窗口
		TicketWin w1 = new TicketWin("窗口1");
		TicketWin w2 = new TicketWin("窗口2");
		TicketWin w3 = new TicketWin("窗口3");
		TicketWin w4 = new TicketWin("窗口4");
		
		//启动线程
		w1.start();
		w2.start();
		w3.start();
		w4.start();
	}

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_50268501/article/details/115296288

智能推荐

简单有效的“单键复用”C51程序_yingxuexuan的博客-程序员宅基地

简单有效的“单键复用”C51程序2009-08-25 00:27<br />        在做我的MINI POV时,考虑到空间有限,必须简化结构,尽量减少按键数量,最后设计只用两个按键作模式转换和时间调整,这样,需将其中的一键“单键复用”,采用最常见的是“短击”、“长击”和“双击”三种模式。这样一来编程就成了问题。<br />         然而,真不明白一个简单的“单键复用”的问题居然在网上还找不到合适的现成的程序,找到的也是一些高深莫测的(还用上什么状态机之类的)东西。没办法,还是自己动手吧!<b

java web 跳转_JavaWeb学习——页面跳转方式_weixin_39987926的博客-程序员宅基地

JavaWeb学习——页面跳转方式摘要:本文主要学习了请求转发和响应重定向,以及两者之间的区别。请求转发相关方法使用HttpServletRequest对象的getRequestDispatcher(String path)方法获取RequestDispatcher类型的转发器。使用RequestDispatcher转发器的forward(ServletRequest request, Se...

mysql里面using btree_mysql 1064 USING BTREE问题_MySQL_燕尾蝶田的博客-程序员宅基地

bitsCN.com从服务器上通过mysqldump命令导出文件在导入到另外的库时,提示:MySQL 返回:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USI...

Dynamic支持CollectionView布局 、 MotionEffects特效 、 BlurImage效果 、 TextKit_weixin_30312557的博客-程序员宅基地

1 使用UIDynamicAnimator对集合视图进行布局1.1 问题UIKit Dynamic动力模型一个非常有趣的用途就是影响集合视图的布局,可以给集合视图的布局添加各种动力行为,使其产生丰富多彩的效果,本案例使用UIDynamicAnimator对集合视图进行布局,实现一个弹性列表,如图-1所示:图-11.2 方案首先创建一个SingleViewApplicat...

双因素认证java_使用spring security oauth2进行双因素身份验证_林John的博客-程序员宅基地

我无法使接受的解决方案有效 . 我一直在研究这个问题,最后我通过使用这里解释的想法并在这个帖子上写了我的解决方案“null client in OAuth2 Multi-Factor Authentication”如果您发现任何问题或更好的方法,我感谢您分享您的反馈意见 .您可以在下面找到此解决方案的关键配置文件 [email protected]@E...

随便推点

android展示latex_在 GitHub Page 中正常展示任意 LaTeX 源码片段_weixin_39860166的博客-程序员宅基地

本文已加入专栏文章目录。精简版GitHub Page 的(一种)输入是 markdown 文件,输出是 HTML/CSS/JS 文件。如果 markdown 文件包含代码块,且代码块中包含花括号 { 或 },尤其是包含 {% 或 {{ 符号组合时,GitHub Page 会报错。分别在代码块前后添加 {% raw %} 和 {% endraw %} 即可解决该问题。参考资料:Jekyll 官方文...

php soap 中文,php soap 开发文档_lem0nster的博客-程序员宅基地

一. 必备知识1.wsdl(web服务标记语言)WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。具体参考请访问下面网址2.soapSOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息。具体参考请访问下面网址3.php扩展具体参考请访问...

视频教程-桫哥-GOlang-09反射-Go语言_weixin_32214323的博客-程序员宅基地

桫哥-GOlang-09反射 多年互联网从业经验;有丰富的的企业网站、手游...

ELK企业级日志分析系统_即使不为人所道的博客-程序员宅基地_企业日志系统

ELK企业级日志分析系统文章目录ELK企业级日志分析系统ELK概述1.ELK简介ElasticSearch:(存储搜索日志)Logstash:(搜集日志)可以添加的其它组件:Kiabana:(提供图形化展示)filebeat结合logstash带来好处:2、为什么要使用ELK:3、完整日志系统基本特征4、ELK的工作原理:部署ELK日志分析系统配置elasticsearch环境部署elasticsearch软件(6)查看节点信息3.安装 Elasticsearch-head 插件(1)编译安装 node(

解决ubuntu 显示不出共享文件夹问题_龙井茶110的博客-程序员宅基地

本人使用的是ubuntu 18.04版本虚拟机但是在与windows 下共享的文件夹看不到, /mnt/hgfs/ 文件夹里面是空的经过查找别人的博客,发现只要执行sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other -o uid=1000即可成功...

推荐文章

热门文章

相关标签