java多线程的三种创建方式

本文详细介绍了Java中创建多线程的三种常见方法:继承Thread类、实现Runnable接口和实现Callable接口。通过实例演示了每种方法的具体应用,包括线程同步、线程间通信及如何获取线程返回值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java多线程的三种创建方式

第一种方式,继承Thread类,重写run方法,这里我模拟了一个买票的系统,四个窗口同时开始卖票

/**
 * 第一种方式,继承Thread类,重写run方法
 * 
 * @author admin
 *
 */
public class MyThread extends Thread {
	private static int num = 100; // 共享变量(基本数据类型的数据),不能当对象锁---因为它不是对象
	private static Object obj = new Object();// 可以新建一个与基本数据类型的共享变量平行的对象,来替代它当作锁
	private String name = null;

	public MyThread(String name) {
		this.name = name;
	}

	@Override
	public void run() {
		while (true) {
			synchronized (obj) {// ※静态变量的对象锁是不能用this来代替的
				if (num > 0) {
					System.out.println(name + ":" + num);
					num--;//卖出去了一张,减去一张
					try {
						Thread.sleep(50);//睡眠0.02秒
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {
					break;
				}
			}
		}
	}
}

第一种方法测试类

/**
 * 测试第一种方式
 * 
 * @author admin
 *
 */
public class MyThreadTest {

	public static void main(String[] args) {
		// 开四个窗口(new线程),让它们都开始卖票(启动线程)
		Thread t1 = new MyThread("窗口1");
		Thread t2 = new MyThread("窗口2");
		Thread t3 = new MyThread("窗口3");
		Thread t4 = new MyThread("窗口4");
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}

控制台输出

窗口1:100
窗口1:99
窗口1:98
窗口1:97
窗口1:96
窗口1:95
窗口1:94
窗口1:93
窗口1:92
窗口1:91
窗口1:90
窗口1:89
窗口1:88
窗口1:87
窗口1:86
窗口1:85
窗口1:84
窗口1:83
窗口1:82
窗口1:81
窗口1:80
窗口1:79
窗口1:78
窗口1:77
窗口1:76
窗口1:75
窗口1:74
窗口1:73
窗口1:72
窗口1:71
窗口1:70
窗口1:69
窗口1:68
窗口1:67
窗口1:66
窗口1:65
窗口1:64
窗口1:63
窗口1:62
窗口1:61
窗口1:60
窗口1:59
窗口1:58
窗口1:57
窗口1:56
窗口1:55
窗口1:54
窗口1:53
窗口1:52
窗口1:51
窗口1:50
窗口1:49
窗口1:48
窗口1:47
窗口1:46
窗口1:45
窗口1:44
窗口1:43
窗口1:42
窗口4:41
窗口4:40
窗口4:39
窗口4:38
窗口4:37
窗口4:36
窗口4:35
窗口4:34
窗口4:33
窗口4:32
窗口4:31
窗口4:30
窗口4:29
窗口4:28
窗口4:27
窗口4:26
窗口4:25
窗口2:24
窗口2:23
窗口2:22
窗口2:21
窗口2:20
窗口2:19
窗口2:18
窗口2:17
窗口2:16
窗口2:15
窗口2:14
窗口2:13
窗口2:12
窗口2:11
窗口2:10
窗口2:9
窗口2:8
窗口2:7
窗口2:6
窗口2:5
窗口2:4
窗口2:3
窗口2:2
窗口2:1

第二种方式,实现runnable接口,重写run方法。这种方法跟第一种类似,因为Thread类实现的就是runnable接口

/**
 * 第二种方式,实现runnable接口,重写run方法
 * 
 * @author admin
 *
 */
public class MyRunnable implements Runnable {
	private static int num = 100;// 共享变量(基本数据类型的数据),不能当对象锁---因为它不是对象
	private static Object obj = new Object();// 可以新建一个与基本数据类型的共享变量平行的对象,来替代它当作锁

	@Override
	public void run() {
		while (num > 0) {
			synchronized (obj) {
				if (num > 0) {
					System.out.println(Thread.currentThread().getName() + "---" + num);
					num--;//卖出去了一张,减去一张
					try {
						Thread.sleep(50);//睡眠0.05秒
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}

}

第二种方式测试

/**
 * 测试第二种方式
 * 
 * @author admin
 *
 */
public class MyRunnableTest {
	public static void main(String[] args) {
		MyRunnable myRunnable = new MyRunnable();//创建runnable对象
		Thread thread1 = new Thread(myRunnable);//runnable对象作为Thread对象的target创建新的线程
		Thread thread2 = new Thread(myRunnable);
		Thread thread3 = new Thread(myRunnable);
		thread1.start();
		thread2.start();
		thread3.start();
	}
}

控制台

Thread-0---100
Thread-0---99
Thread-0---98
Thread-0---97
Thread-0---96
Thread-0---95
Thread-0---94
Thread-0---93
Thread-0---92
Thread-0---91
Thread-0---90
Thread-0---89
Thread-0---88
Thread-0---87
Thread-1---86
Thread-1---85
Thread-1---84
Thread-1---83
Thread-1---82
Thread-1---81
Thread-1---80
Thread-1---79
Thread-1---78
Thread-1---77
Thread-1---76
Thread-1---75
Thread-1---74
Thread-1---73
Thread-1---72
Thread-1---71
Thread-1---70
Thread-1---69
Thread-1---68
Thread-1---67
Thread-2---66
Thread-2---65
Thread-2---64
Thread-2---63
Thread-2---62
Thread-2---61
Thread-2---60
Thread-2---59
Thread-2---58
Thread-2---57
Thread-2---56
Thread-2---55
Thread-2---54
Thread-2---53
Thread-2---52
Thread-2---51
Thread-2---50
Thread-2---49
Thread-2---48
Thread-2---47
Thread-2---46
Thread-2---45
Thread-2---44
Thread-2---43
Thread-2---42
Thread-2---41
Thread-2---40
Thread-2---39
Thread-2---38
Thread-2---37
Thread-2---36
Thread-2---35
Thread-2---34
Thread-2---33
Thread-2---32
Thread-2---31
Thread-2---30
Thread-2---29
Thread-2---28
Thread-1---27
Thread-1---26
Thread-1---25
Thread-1---24
Thread-1---23
Thread-1---22
Thread-1---21
Thread-1---20
Thread-1---19
Thread-1---18
Thread-1---17
Thread-1---16
Thread-1---15
Thread-1---14
Thread-1---13
Thread-1---12
Thread-1---11
Thread-1---10
Thread-1---9
Thread-1---8
Thread-1---7
Thread-1---6
Thread-1---5
Thread-1---4
Thread-1---3
Thread-1---2
Thread-1---1

第三种方式,实现callable接口,重写call方法,这种方法可以获取线程的返回值

/**
 * 第三种方式,实现callable接口,重写call方法
 * 
 * @author admin
 *
 */
public class MyCallable implements Callable<Integer> {
	private static int i = 0;

	@Override
	public Integer call() throws Exception {
		int sum = 0;
		for (; i < 100; i++) {
			System.out.println(Thread.currentThread().getName() + " " + i);
			sum += i;
		}
		return sum;
	}

}

第三种方式测试

/**
 * 测试第三种方式
 * 
 * @author admin
 *
 */
public class MyCallableTest {
	public static void main(String[] args) {
		Callable<Integer> myCallable = new MyCallable(); // 创建MyCallable对象
		FutureTask<Integer> ft = new FutureTask<Integer>(myCallable); // 使用FutureTask来包装MyCallable对象
		Thread thread = new Thread(ft); // FutureTask对象作为Thread对象的target创建新的线程
		thread.start(); // 线程进入到就绪状态
		try {
			int sum = ft.get(); // 用FutureTask对象的get()方法取得新创建的新线程中的call()方法返回的结果
			System.out.println("sum = " + sum);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}

	}
}

控制台

Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
Thread-0 10
Thread-0 11
Thread-0 12
Thread-0 13
Thread-0 14
Thread-0 15
Thread-0 16
Thread-0 17
Thread-0 18
Thread-0 19
Thread-0 20
Thread-0 21
Thread-0 22
Thread-0 23
Thread-0 24
Thread-0 25
Thread-0 26
Thread-0 27
Thread-0 28
Thread-0 29
Thread-0 30
Thread-0 31
Thread-0 32
Thread-0 33
Thread-0 34
Thread-0 35
Thread-0 36
Thread-0 37
Thread-0 38
Thread-0 39
Thread-0 40
Thread-0 41
Thread-0 42
Thread-0 43
Thread-0 44
Thread-0 45
Thread-0 46
Thread-0 47
Thread-0 48
Thread-0 49
Thread-0 50
Thread-0 51
Thread-0 52
Thread-0 53
Thread-0 54
Thread-0 55
Thread-0 56
Thread-0 57
Thread-0 58
Thread-0 59
Thread-0 60
Thread-0 61
Thread-0 62
Thread-0 63
Thread-0 64
Thread-0 65
Thread-0 66
Thread-0 67
Thread-0 68
Thread-0 69
Thread-0 70
Thread-0 71
Thread-0 72
Thread-0 73
Thread-0 74
Thread-0 75
Thread-0 76
Thread-0 77
Thread-0 78
Thread-0 79
Thread-0 80
Thread-0 81
Thread-0 82
Thread-0 83
Thread-0 84
Thread-0 85
Thread-0 86
Thread-0 87
Thread-0 88
Thread-0 89
Thread-0 90
Thread-0 91
Thread-0 92
Thread-0 93
Thread-0 94
Thread-0 95
Thread-0 96
Thread-0 97
Thread-0 98
Thread-0 99
sum = 4950

个人写的小Demo,如有不足还请各路大神指教

内容概要:《2024年中国城市低空经济发展指数报告》由36氪研究院发布,指出低空经济作为新质生产力的代表,已成为中国经济新的增长点。报告从发展环境、资金投入、创新能力、基础支撑和发展成效五个维度构建了综合指数评价体系,评估了全国重点城市的低空经济发展状况。北京和深圳在总指数中名列前茅,分别以91.26和84.53的得分领先,展现出强大的资金投入、创新能力和基础支撑。低空经济主要涉及无人机、eVTOL(电动垂直起降飞行器)和直升机等产品,广泛应用于农业、物流、交通、应急救援等领域。政策支持、市场需求和技术进步共同推动了低空经济的快速发展,预计到2026年市场规模将突破万亿元。 适用人群:对低空经济发展感兴趣的政策制定者、投资者、企业和研究人员。 使用场景及目标:①了解低空经济的定义、分类和发展驱动力;②掌握低空经济的主要应用场景和市场规模预测;③评估各城市在低空经济发展中的表现和潜力;④为政策制定、投资决策和企业发展提供参考依据。 其他说明:报告强调了政策监管、产业生态建设和区域融合错位的重要性,提出了加强法律法规建设、人才储备和基础设施建设等建议。低空经济正加速向网络化、智能化、规模化和集聚化方向发展,各地应找准自身比较优势,实现差异化发展。
数据集一个高质量的医学图像数据集,专门用于脑肿瘤的检测和分类研究以下是关于这个数据集的详细介绍:该数据集包含5249张脑部MRI图像,分为训练集和验证集。每张图像都标注了边界框(Bounding Boxes),并按照脑肿瘤的类型分为四个类别:胶质瘤(Glioma)、脑膜瘤(Meningioma)、无肿瘤(No Tumor)和垂体瘤(Pituitary)。这些图像涵盖了不同的MRI扫描角度,包括矢状面、轴面和冠状面,能够全面覆盖脑部解剖结构,为模型训练提供了丰富多样的数据基础。高质量标注:边界框是通过LabelImg工具手动标注的,标注过程严谨,确保了标注的准确性和可靠性。多角度覆盖:图像从不同的MRI扫描角度拍摄,包括矢状面、轴面和冠状面,能够全面覆盖脑部解剖结构。数据清洗与筛选:数据集在创建过程中经过了彻底的清洗,去除了噪声、错误标注和质量不佳的图像,保证了数据的高质量。该数据集非常适合用于训练和验证深度学习模型,以实现脑肿瘤的检测和分类。它为开发医学图像处理中的计算机视觉应用提供了坚实的基础,能够帮助研究人员和开发人员构建更准确、更可靠的脑肿瘤诊断系统。这个数据集为脑肿瘤检测和分类的研究提供了宝贵的资源,能够帮助研究人员开发出更准确、更高效的诊断工具,从而为脑肿瘤患者的早期诊断和治疗规划提供支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值