Java线程学习-程序员宅基地

技术标签: 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

智能推荐

Uboot启动流程(一)_init_sequence_r-程序员宅基地

文章浏览阅读757次。Uboot启动流程简要列举,帮助梳理启动流程。详细过程参考Uboot源码和《STM32MP1嵌入式Linux驱动开发指南》讲解_init_sequence_r

Android之OkHttp详解(非原创)-程序员宅基地

文章浏览阅读309次。文章大纲一、OkHttp简介二、OkHttp简单使用三、OkHttp封装四、项目源码下载一、OkHttp简介1. 什么是OkHttp  一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理。比如可以使用http客户端与第三方服务(如SSO服务)进行集成,..._android okhttp3封装使用

GIT常用命令_ugit新增仓库-程序员宅基地

文章浏览阅读198次。文章目录git笔记安装配置新建仓库。提交、关联从现有仓库克隆从另一个仓库合并代码到本地更新本地分支远端标签导出问题解决回滚到任意版本提交代码时 无法直接 git pull 问题。因为 本地分支没有和远程分支进行关联当控制台提示本地版本 滞后 远程版本时, 使用强制提交 覆盖远程分支(慎用!慎用!慎用!)代码写错分支,怎么办?欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左_ugit新增仓库

ssh另一台机器时,报Password authentication is disabled to avoid man-in-the-middle attacks.-程序员宅基地

文章浏览阅读8k次。原文地址::http://www.blogjava.net/anchor110/articles/418195.html相关文章1、好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established.的问题----http://blog.csdn.net/kimsoft/article/detai_password authentication is disabled to avoid man-in-the-middle attacks

MATLAB mmseg,Unofficial Windows Binaries for Python Extensio...-程序员宅基地

文章浏览阅读80次。GNU Aspell (LyX fork).aspell_python-1.12.win-amd64-py2.6.‌exe [473KB] [Python 2.6] [64 bit] [Aug 14, 2012]aspell_python-1.12.win-amd64-py2.7.‌exe [473KB] [Python 2.7] [64 bit] [Aug 14, 2012]...

Unity Graphics (Unity 图形渲染 ) 官方教程文档笔记系列之一-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏9次。Unity Graphics (Unity 图形渲染 ) - Everything for Lighting and Rendering in Unity - 主要涉及到光照与渲染方面的知识本文档主要是对Unity官方教程的个人理解与总结(其实以翻译记录为主:&amp;amp;amp;amp;gt;) 仅作为个人学习使用,不得作为商业用途,欢迎转载,并请注明出处。 ..._unity graphics

随便推点

JavaScript—改变字体颜色和大小_js 展示字体大小和颜色-程序员宅基地

文章浏览阅读5.7k次。写一个定时器,每个一秒修改一次div内文本颜色和文字大小 最开始这个文字是默认大小,大小开始增大,当增大了6次以后, 文字大小开始缩小,缩小6次,文字在开始增大。首先改变字体颜色和大小.html<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="I..._js 展示字体大小和颜色

Cerc2014 Virus synthesis-程序员宅基地

文章浏览阅读110次。题目描述:你要用ATGC四个字母用两种操作拼出给定的串:1.将其中一个字符放在已有串开头或者结尾2.将已有串复制,然后reverse,再接在已有串的头部或者尾部一开始已有串为空。求最少操作次数。len<=100000题解:PAM+dp。先建出PAM,然后对于每一个偶树上的串,满足:1.得到上一个串时一定是先延长后倍增,所以dp[ i ] ...

coalesce 与 repartition的用法与区别_rdd.coalesce(100)-程序员宅基地

文章浏览阅读468次。它们两个都是RDD的分区进行重新划分,repartition只是coalesce接口中shuffle为true的简易实现先看coalesce: /** * Return a new RDD that is reduced into `numPartitions` partitions. * * This results in a narrow dependency, e.g...._rdd.coalesce(100)

手把手讲解在ubuntu16.04安装视觉SLAM14讲中的全部第三方库-程序员宅基地

文章浏览阅读3.3k次,点赞9次,收藏55次。本教程按照视觉SLAM14讲中的章节进行操作,所有的安装程序包括依赖库,版本均在文中标出,并且在Mac pro 虚拟机下的Ubuntu 16.04版本中安装运行过。_手把手讲解在ubuntu16.04安装视觉slam

05FFMPEG的AVIOContext结构体分析_ffmpeg avio-程序员宅基地

文章浏览阅读216次。FFMPEG的AVIOContext结构体分析概述:该结构体位于libavformat库中的avio.h中。1 AVIOContext结构体typedef struct AVIOContext { /** * A class for private options. * * If this AVIOContext is created by avio_open2(), av_class is set and * passes the options d_ffmpeg avio

Top 100 Software Testing Blogs _top 100 cocktail blogs-程序员宅基地

文章浏览阅读695次。之前推荐了200开发人员blog列表Top 200 Blogs for Developers,在testingminded有人推荐了100测试blog,在这里摘录如下,希望对测试人员有所帮助!#SiteAuthor1James Bachs BlogJames Bach2Test_top 100 cocktail blogs

推荐文章

热门文章

相关标签