前言
网上有多关于“JAVA多线程”的文章,但是对于不太熟悉多线程的编程人员来说人来说太抽象了,干脆我就直接用代码告诉大家何为多线程,不同的编写方式会带来怎样的后果以及如何正确的使用多线程。
示例程序功能描述
SynchronizedDemo.java业务功能:模拟火车售票场景。成员变量total表示火车表总量。showToal()一旦被执行就开始卖表(total-1),票没了(当total的值小于等于零)就停止卖票。
业务代码及执行结果
/** * 模拟火车售票场景。成员变量total表示火车表总量。showToal()一旦被执行就开始卖表(total-1),票没了(当total的值小于等于零)就停止卖票 * @author 许井龙 * */ public class SynchronizedDemo implements Runnable { /* 火车票总量*/ private static int total = 100; /** * 程序入口 * @param args */ public static void main(String[] args) { //模拟八个售票窗口 Thread td1 = new Thread(new SynchronizedDemo()); Thread td2 = new Thread(new SynchronizedDemo()); Thread td3 = new Thread(new SynchronizedDemo()); Thread td4 = new Thread(new SynchronizedDemo()); Thread td5 = new Thread(new SynchronizedDemo()); Thread td6 = new Thread(new SynchronizedDemo()); Thread td7 = new Thread(new SynchronizedDemo()); Thread td8 = new Thread(new SynchronizedDemo()); //八个售票窗口同时售票; td1.start(); td2.start(); td3.start(); td4.start(); td5.start(); td6.start(); td7.start(); td8.start(); } @Override /** * 多线程执行入口 */ public void run() { //售票:稍后会有不同的具体实现 showToal(); } }如果showToal()代码如下,
public void showToal(){ //long sTime = System.currentTimeMillis(); while(true){ //当总量(total)当小于等于0的时候,就不能在继续减少了 if(total>0){ try { //模拟线程阻塞1ms Thread.sleep(1); } catch (Exception e) { e.printStackTrace(); } total = total - 1; System.out.println(Thread.currentThread().getName() + " 余票: " + total + "张"); }else{ //反之结束程序 break; } } //System.out.println(Thread.currentThread().getName() + "耗时:" + (System.currentTimeMillis() - sTime)/1000); }执行结果如下,
.... Thread-4 余票: 5张 Thread-1 余票: 4张 Thread-0 余票: 3张 Thread-3 余票: 0张 Thread-5 余票: 1张 Thread-2 余票: 2张 Thread-7 余票: -1张 Thread-1 余票: -2张 Thread-6 余票: -3张 Thread-4 余票: -4张余票居然出现了负数,显然是我们程序出现了漏洞。聪明的你马上就意识到,showTota()没有使用synchronized。因此你修改了showTota(),
public synchronized void showToal(){ //long sTime = System.currentTimeMillis(); while(true){ // 当总量(total)当小于等于0的时候,就不能在继续减少了 if(total>0){ try { //模拟线程阻塞1ms Thread.sleep(1); } catch (Exception e) { e.printStackTrace(); } total = total - 1; System.out.println(Thread.currentThread().getName() + " 余票: " + total + "张"); //反之结束程序 }else{ break; } } //System.out.println(Thread.currentThread().getName() + "耗时:" + (System.currentTimeMillis() - sTime)/1000); }但是我们看看运行结果,
Thread-5 余票: 4张 Thread-2 余票: 4张 Thread-4 余票: 6张 Thread-6 余票: 6张 Thread-3 余票: 6张 Thread-0 余票: 2张 Thread-7 余票: 2张 Thread-4 余票: -3张 Thread-1 余票: -4张 Thread-2 余票: -4张 Thread-3 余票: -3张 Thread-5 余票: -3张 Thread-6 余票: -3张 Thread-0 余票: -6张 Thread-7 余票: -6张似乎和你预期的不太一样哦。那么是synchronized没生效?还是我们使用的不对呢?现在我告诉你:showToal()需要声明为static。
相关推荐
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
一个java 多线程操作数据库应用程序!!!
详细的讲解了java多线程的原理,并配有代码进行实战,适合java初学者和想对多线程有进一步了解的人。
学习java多线程的经典例子,让你深刻了解java多线程编程。
多线程启动.java多线程启动.java多线程启动.java多线程启动.java
java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例
java多线程并发查询数据库,使用线程池控制分页,并发查询。
该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!
java多线程处理数据库数据,使用并发包,无框架,可批量处数据库数据,进行增删改。。等等操作。
java多线程进度条
资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著 结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 Java多线程无处不在,如...
现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。...本文档提供Java多线程编程经验,方便广大Java爱好者研究学习Java多线程
java多线程并发的在新窗口
java多线程处理大数据,可根据配置的线程数,任务去调度处理
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
java多线程文件传输 java多线程文件传输
Java多线程下载Java多线程下载Java多线程下载Java多线程下载Java多线程下载
java多线程,对多线程,线程池进行封装,方便使用