public class Acount { private int money; Acount(int money) { this.money = money; } public synchronized void getMoney(int money) { while (this.money < money xss=removed xss=removed xss=removed xss=removed xss=removed>
#
import java.util.Random; public class Bank implements Runnable{ Acount acount; public Bank(Acount acount) { this.acount = acount; } @Override public void run() { while(true) { int random = (int)(Math.random() * 1000); acount.setMoney(random); } } }
#
public class Consumer implements Runnable{ Acount acount; Consumer(Acount acount) { this.acount = acount; } @Override public void run() { while (true) { int random = (int)(Math.random() * 1000); acount.getMoney(random); } } }
通过在线程之间共享对象就可以了,然后通过wait/notify/notifyAll、await/signal/signalAll进行唤起和等待,比方说阻塞队列BlockingQueue就是为线程之间共享数据而设计的
1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据。
2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象。
1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。
2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程。其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款
回到顶部
每个线程执行的代码相同,可以使用同一个Runnable对象
public class RunnalbleTest2 implements Runnable { private int threadCnt = 10; @Override public void run() { while (true) { if (threadCnt > 0) { System.out.println(Thread.currentThread().getName() + " 剩余个数 " + threadCnt); threadCnt--; try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } } else { break; } } } public static void main(String[] args) { RunnalbleTest2 runnalbleTest2 = new RunnalbleTest2(); new Thread(runnalbleTest2).start(); new Thread(runnalbleTest2).start(); } }
结果
Thread-0 剩余个数 10 Thread-1 剩余个数 10 Thread-0 剩余个数 8 Thread-1 剩余个数 7 Thread-0 剩余个数 6 Thread-1 剩余个数 5 Thread-0 剩余个数 4 Thread-1 剩余个数 3 Thread-0 剩余个数 2 Thread-1 剩余个数 1
每个线程执行的代码不同,用不同的Runnable对象
#
public class Acount { private int money; Acount(int money) { this.money = money; } public synchronized void getMoney(int money) { while (this.money < money xss=removed xss=removed xss=removed xss=removed xss=removed>
#
import java.util.Random; public class Bank implements Runnable{ Acount acount; public Bank(Acount acount) { this.acount = acount; } @Override public void run() { while(true) { int random = (int)(Math.random() * 1000); acount.setMoney(random); } } }
#
public class Consumer implements Runnable{ Acount acount; Consumer(Acount acount) { this.acount = acount; } @Override public void run() { while (true) { int random = (int)(Math.random() * 1000); acount.getMoney(random); } } }
结果
新存入442,总额:442 余额不足 新存入196,总额:638 新存入815,总额:1453 取出534,还剩919 新存入402,总额:1321 取出719,还剩602 取出11,还剩591 ....
通过在线程之间共享对象就可以了,然后通过wait/notify/notifyAll、await/signal/signalAll进行唤起和等待,比方说阻塞队列BlockingQueue就是为线程之间共享数据而设计的
1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。
2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程。其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款
相关问题推荐
Java的线程生命周期有六种状态:New(初始化状态)Runnable(就绪状态)Running(运行状态)Blocked(阻塞状态)Terminated(终止状态)
如果使用常量的方式,该对象将被存储在常量池(永久代)如果使用new的方式,该对象将被存储在堆
同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。...
Vue.js是一款流行的JavaScript前端框架,一个用于创建用户界面的开源JavaScript框架,旨在更好地组织与简化 Web开发。 Vue所关注的核心是MVC模式中的视图层,同时,它也能方便地获取数据更新,并通过组件内部特定的方法实现...
1、throw和throws两个都是Java语言中的关键字2、throw关键字是用来抛出异常对象,throws关键字是用来声明声明异常的类型3、throw只能抛出一个异常对象,throws可以抛出多个异常类型
线程从创建到结束的一个过程就是线程的生命周期。在线程的生命周期中,有不同的状态来描述。状态的罗列:新建态:线程刚刚创建之后的状态就绪态:准备好了各种资源,等待cpu来临运行态:正在运行的状态阻塞态:线程休眠,IO,等到锁对象死亡态:线程正常执行...
MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式。它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。
没有所谓的核心线程,线程只有单线程和多线程之分~首先,关于计算机系统的很多概念,都有逻辑层 和 物理层的区分,这个是前提。然后再看,核心这个概念是物理层的概念,指的就是 CPU硬件的物理核心数量。而线程 这个概念,是逻辑层的概念,而且这个逻辑层的概...
groupNum = / List listThreads = ArrayList()(i = i
多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程...
这是一个非常刁钻和狡猾的问题。请记住:线程类的构造方法、静态块是被 new这个线程类所在的线程所调用的,而 run 方法里面的代码才是被线程自身所调用 的。如果说上面的说法让你感到困惑,那么我举个例子,假设 Thread2 中 new 了 Thread1,main ...
多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度程序的运行速度可能加快在...
单例模式是为确保一个类只有一个实例,并为整个系统提供一个全局访问点的一种模式方法。单例模式的特点:(1)、在任何情况下,单例类永远只有一个实例存在。(2)、单例需要有能力为整个系统提供这一唯一实例。...
很多人都知道死锁是怎么一回事儿:线程A和线程B相互等待对方持有的锁导致程序无限死循环下去。当然也仅限于此了,问一下怎么写一个死锁的程序就不知道了,这种情况说白了就是不懂什么是死锁,懂一个理论就完事儿了,实践中碰到死锁的问题基本上是看不出来的。...