`

多线程2

 
阅读更多

1 多线程的两种方式

   ① 创建一个类,继承Thread,重写run方法,

   

public class MyThread extends Thread {
	@Override
	public void run() {
		for(int i=0;i <=200;i++){
			System.out.println(i+getName());
		
		}
	}
}


public class Demo1 {
	public static void main(String[] args) {
		MyThread myThread1 = new MyThread();
		MyThread myThread2 = new MyThread();
		myThread1.start();
		myThread2.start();
	}
}

 

 

 

   ② 创建一个类,实现Runnable接口,重写run方法,

 

public class MyThread2 implements Runnable{

	@Override
	public void run() {
		for(int i = 1;i<=100;i++){
			System.out.println(i+Thread.currentThread().getName());
		}
	}

}

public class Demo2 {
	public static void main(String[] args) {
		MyThread2 mt2 = new MyThread2();
		Thread th2 = new Thread(mt2);
		Thread th3 = new Thread(th2);
		th2.start();
		th3.start();	
	}
}

 

 

 2  线程安全

  ① 发生线程安全的条件

     1 . 是否有共享数据

     2 . 是否是多线程

     3 .  是否对同一数据进行操作

  ② 线程锁案例

    1 创建自定义线程类,模拟去电影院购买电影票。

public class MyThread3 implements Runnable{
	private int ticket = 100;

	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		while(true){
		
				if(ticket>0){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()
							+ "正在出售第" + (ticket--) + "张票 ");	
				}		
			
		}
	}
	
}

 创建相应的测试类

 

public class Demo3 {

	public static void main(String[] args) {
		
		MyThread3 thread3 = new MyThread3();
		Thread t1 = new Thread(thread3, "1号");
		Thread t2 = new Thread(thread3, "2号");
		Thread t3 = new Thread(thread3, "3号");
		t1.start();
		t2.start();
		t3.start();
	}
}

 

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

 通过控制台,我们可以看出打印的有问题,票有很多重复了。就是因为多线程的原因,分析一下原因,当1 号刚进来的时候,执行了--ticket的时候,这个时候,线程2进来了,所以出现了很多都在出卖同一张票的原因,下面说一下解决方案

 

public class MyThread3 implements Runnable{
	private int ticket = 100;
	
	private Object object = new Object();
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true){
		synchronized (object) {
				if(ticket>0){
					try {
						Thread.sleep(200);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()
							+ "正在出售第" + (ticket--) + "张票 ");	
				}
			}
	
		}
	}
}

   我在主要的代码段上添加锁的机制,

synchronized (object) 

   里面传递的参数是任意的,这个时候,当线程1进入的时候,会给cpu上一把锁,其他的线程不能进入,只有当线程1离开的时候,其他的线程才能进来。运行之后,我们查看控制台

 

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

 

 

 

 

  • 大小: 7.4 KB
分享到:
评论

相关推荐

    C#泛型参数多线程与复杂参数多线程2

    最近用多线程用的比较多自己走了一些弯路,分享出来希望大家少走弯路,C#中的多线程有两个重载,一个是不带参数的,一个是带参数的,但是即便是带参数的多线程也不支持泛型,这使得使用泛型参数多线程的时候很不方便...

    面试-JVM+多线程v2

    面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-...

    linux c++ socket 多线程2

    第二套:c语言Socket编程C语言SOCKET编程指南.c语言多进程多线程程.pdf,Linux Socket rogramming by Example.pdf,Linux 多线程等10多个资料....

    多线程测试(是多线程的测试,对学习多线程的朋友有用)

    2. 线程安全测试:检查代码是否正确地处理了多线程环境下的数据访问。 3. 资源消耗测试:分析多线程运行时内存、CPU和其他资源的使用情况。 4. 并发测试:评估程序在高并发场景下的稳定性和响应能力。 5. 错误处理和...

    大漠多线程模板_大漠_大漠多线程_

    2. **线程同步**:在多线程环境中,防止数据竞争和确保资源安全访问是至关重要的。C#提供了多种同步机制,如`Mutex`、`Semaphore`、`Monitor`和`lock`关键字。模板可能内置了这些同步工具的使用,减少了因不当同步...

    C#多线程互斥实例 多线程获取同一变量

    2. **共享资源**:在多线程环境中,多个线程可能需要访问同一个数据或对象,这就形成了共享资源。 3. **竞态条件**:当两个或多个线程同时访问并修改共享资源时,如果没有适当的同步措施,可能导致数据的不一致性,...

    pb9多线程控件,能够真实实现多线程

    2. Ttimer.ocx控件:这是一个可能用于多线程环境的ActiveX定时器控件,可以触发并发操作。 3. 多线程的优势:多线程能提高应用的响应速度,特别是在需要执行耗时任务时,可以避免UI冻结。 4. 共享机制与多线程的区别...

    多线程_按键精灵经典多线程操作_

    2. **资源利用率最大化**:多线程使得CPU的空闲时间减少,尤其是在多核处理器环境下,每个核心都可以处理一个线程,使得系统资源得到充分利用。 3. **任务独立性**:每个线程执行的任务相互独立,即使其中一个线程...

    易语言多线程传递多参数

    在编程领域,多线程是实现并发执行任务的重要机制,特别是在易语言中,它能有效提升程序的执行效率。易语言是一种中文编程语言,旨在降低编程门槛,让普通用户也能进行程序开发。本文将深入探讨易语言中的多线程以及...

    多线程编程示例

    在IT领域,多线程编程是一项关键技能,尤其是在性能优化和并发处理方面。本文将深入探讨多线程编程的基础知识,以帮助初学者快速入门。 首先,我们需要理解什么是多线程。多线程是指在一个进程中同时执行多个独立的...

    网络编程6-多线程2.ppt

    《网络编程中的多线程技术》 多线程技术在网络编程中扮演着至关重要的角色,它允许程序同时执行多个任务,提高了系统的效率和响应性。本文将深入探讨多线程的概念、创建方法以及互斥与同步机制。 首先,我们理解...

    多线程的运用e语言多线程 e多线程

    在编程领域,多线程是一种重要的并发执行机制,它允许程序同时执行多个任务,从而提高系统资源利用率和程序响应速度。E语言(可能是错误输入或者是某个特定编程环境或语言的简称)中的多线程功能也不例外。本文将...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行

    2. **线程同步与互斥**:在多线程环境中,确保数据的一致性和完整性至关重要。线程同步可以通过`Mutex`、`Monitor`、`Semaphore`、`ReaderWriterLockSlim`等工具实现。例如,`Mutex`可以实现全局资源的独占访问,...

    PB多线程实现

    本文将详细探讨PB(包括PB9、PB12.5以及PB.NET)实现多线程的方法。 一、PB9的多线程实现 在PB9中,虽然官方并未直接支持多线程,但开发者可以通过使用Windows API函数来实现。一种常见的方式是创建一个新的窗口类...

    多线程框架通用多线程源码.zip

    《深入理解易语言版多线程通用框架》 在计算机编程中,多线程是一种并发执行任务的技术,它允许多个任务在同一时间内运行,从而提高了系统资源的利用率和程序的响应速度。尤其在易语言这样的高级编程环境中,多线程...

    鱼刺多线程注册源码例子(鱼刺多线程稳定框架)

    "鱼刺多线程注册源码例子"是一个基于"鱼刺多线程稳定框架"的编程实践,旨在展示如何在软件开发中有效地利用多线程技术来提高程序的执行效率和稳定性。在这个例子中,"鱼刺框架"可能是一个专门为多线程编程设计的开源...

    12.1 Qt5多线程:多线程及简单实例

    在编程领域,尤其是在开发高效、响应迅速的应用程序时,多线程技术扮演着至关重要的角色。Qt5框架提供了一种方便的方式来实现多线程,它允许开发者在不同的线程中执行任务,从而避免主线程(GUI线程)因处理耗时操作...

    C# 多线程实例多线程实例多线程实例

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的语言中,它提供了丰富的多线程支持。本文将深入探讨C#中的多线程实例,以帮助开发者理解如何有效地利用多核处理器资源,提高程序的执行效率。 多...

    Qt 多线程及简单实例 demo

    2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对代码的细微修改都可能产生意想不到的效果。 先由一个简单的例子引出多线程 先作出这个简单的界面 “开始”对应的槽函数是:...

Global site tag (gtag.js) - Google Analytics