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张票
相关推荐
最近用多线程用的比较多自己走了一些弯路,分享出来希望大家少走弯路,C#中的多线程有两个重载,一个是不带参数的,一个是带参数的,但是即便是带参数的多线程也不支持泛型,这使得使用泛型参数多线程的时候很不方便...
面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-...
第二套: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`关键字。模板可能内置了这些同步工具的使用,减少了因不当同步...
2. **共享资源**:在多线程环境中,多个线程可能需要访问同一个数据或对象,这就形成了共享资源。 3. **竞态条件**:当两个或多个线程同时访问并修改共享资源时,如果没有适当的同步措施,可能导致数据的不一致性,...
2. Ttimer.ocx控件:这是一个可能用于多线程环境的ActiveX定时器控件,可以触发并发操作。 3. 多线程的优势:多线程能提高应用的响应速度,特别是在需要执行耗时任务时,可以避免UI冻结。 4. 共享机制与多线程的区别...
2. **资源利用率最大化**:多线程使得CPU的空闲时间减少,尤其是在多核处理器环境下,每个核心都可以处理一个线程,使得系统资源得到充分利用。 3. **任务独立性**:每个线程执行的任务相互独立,即使其中一个线程...
在IT领域,多线程编程是一项关键技能,尤其是在性能优化和并发处理方面。本文将深入探讨多线程编程的基础知识,以帮助初学者快速入门。 首先,我们需要理解什么是多线程。多线程是指在一个进程中同时执行多个独立的...
在编程领域,多线程是实现并发执行任务的重要机制,特别是在易语言中,它能有效提升程序的执行效率。易语言是一种中文编程语言,旨在降低编程门槛,让普通用户也能进行程序开发。本文将深入探讨易语言中的多线程以及...
《网络编程中的多线程技术》 多线程技术在网络编程中扮演着至关重要的角色,它允许程序同时执行多个任务,提高了系统的效率和响应性。本文将深入探讨多线程的概念、创建方法以及互斥与同步机制。 首先,我们理解...
本文将详细探讨PB(包括PB9、PB12.5以及PB.NET)实现多线程的方法。 一、PB9的多线程实现 在PB9中,虽然官方并未直接支持多线程,但开发者可以通过使用Windows API函数来实现。一种常见的方式是创建一个新的窗口类...
在编程领域,多线程是一种重要的并发执行机制,它允许程序同时执行多个任务,从而提高系统资源利用率和程序响应速度。E语言(可能是错误输入或者是某个特定编程环境或语言的简称)中的多线程功能也不例外。本文将...
2. **线程同步与互斥**:在多线程环境中,确保数据的一致性和完整性至关重要。线程同步可以通过`Mutex`、`Monitor`、`Semaphore`、`ReaderWriterLockSlim`等工具实现。例如,`Mutex`可以实现全局资源的独占访问,...
"鱼刺多线程注册源码例子"是一个基于"鱼刺多线程稳定框架"的编程实践,旨在展示如何在软件开发中有效地利用多线程技术来提高程序的执行效率和稳定性。在这个例子中,"鱼刺框架"可能是一个专门为多线程编程设计的开源...
《深入理解易语言版多线程通用框架》 在计算机编程中,多线程是一种并发执行任务的技术,它允许多个任务在同一时间内运行,从而提高了系统资源的利用率和程序的响应速度。尤其在易语言这样的高级编程环境中,多线程...
在编程领域,尤其是在开发高效、响应迅速的应用程序时,多线程技术扮演着至关重要的角色。Qt5框架提供了一种方便的方式来实现多线程,它允许开发者在不同的线程中执行任务,从而避免主线程(GUI线程)因处理耗时操作...
在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的语言中,它提供了丰富的多线程支持。本文将深入探讨C#中的多线程实例,以帮助开发者理解如何有效地利用多核处理器资源,提高程序的执行效率。 多...
2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对代码的细微修改都可能产生意想不到的效果。 先由一个简单的例子引出多线程 先作出这个简单的界面 “开始”对应的槽函数是:...