public class Test00 {
public static void main(String[] args) {
TicketRunnable tr=new TicketRunnable();
new Thread(tr,"线程1").start();
new Thread(tr,"线程2").start();
}
}class TicketRunnable implements Runnable {
private int i=10;
public void run(){
while(i>=1){
System.out.println(Thread.currentThread().getName()+"卖第"+i--+"张票");
}
}
}为什么结果有两种:
第一种:
线程1卖第10张票
线程2卖第9张票
线程2卖第7张票
线程2卖第6张票
线程1卖第8张票
线程1卖第4张票
线程2卖第5张票
线程2卖第2张票
线程1卖第3张票
线程2卖第1张票第二种:
线程1卖第10张票
线程1卖第9张票
线程1卖第8张票
线程2卖第10张票
线程2卖第6张票
线程1卖第7张票
线程1卖第4张票
线程2卖第5张票
线程2卖第2张票
线程2卖第1张票
线程1卖第3张票而且第二种的结果一般是程序运行7到8次才会出现。原理是什么?这涉及到cpu的工作原理?
解决方案 »
- java写一个txt阅读器
- 请问一个jtable的数据更新问题!请高手指点!
- 对求出的多个数,如何放在另一个新的数组里?
- Java I/O流中字节流与字符流区别以及关于.read( )方法的使用
- Entry函数问题
- JTAble与JScrollpane滚动条显示问题
- java 文本框内容改变事件
- 这样的sql怎么写啊,高手帮帮我!
- 请教char的问题
- 关于SWT:swt界面怎么刷新啊,在我的界面中有一个标签是显示程序执行状态的,一个方法调用过程中状态可能会变化很多次,但程序每次执行完
- 为什么多态的情况下,子父类存在同名的非静态函数的时候,默认是调用子类的成员函数.
- socket服务如何与netty的http服务兼容
但是由于循环10次的操作用时极短, 线程启动也是需要时间的, 所以出现不重复数据次数较少.想要保证正常出票可以将 int i=10;改为AtomicInteger i = 10; 或者将int i=10;前面加上volatile关键字.
while (i > 1) {
synchronized (this) {
System.out.println(Thread.currentThread().getName() + "卖第"+ i-- + "张票");}
}
因为多个线程都获取cpu的执行权。cpu执行到谁,谁就运行。
明确一点,在某一个时刻,只能有一个程序在运行。(多核除外)
cpu在做着快速的切换,以达到看上去是同时运行的效果。
我们可以形象把多线程的运行行为在互相抢夺cpu的执行权。
多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,cpu说的算。