class AB
{
public static void main(String[] args)
{
A s=new A();
Thread t1=new Thread(s);
Thread t2=new Thread(s);
Thread t3=new Thread(s);
Thread t4=new Thread(s);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class A implements Runnable
{
private int tick=100;
public void run()
{
while(true)
{
if(tick>0)
{//try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"......."+tick--);
}
}
}
}
{
public static void main(String[] args)
{
A s=new A();
Thread t1=new Thread(s);
Thread t2=new Thread(s);
Thread t3=new Thread(s);
Thread t4=new Thread(s);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class A implements Runnable
{
private int tick=100;
public void run()
{
while(true)
{
if(tick>0)
{//try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"......."+tick--);
}
}
}
}
解决方案 »
- 问大家java的j2se的get、set和public、private的问题?
- IO操作的小问题,菜鸟求助帖
- 关于静态类的问题
- 谁有corejava包,能给我发一个吗?10分相送
- 用Class.newInstance()创建实例快,还是用new创建实例快?
- 十万火急!!用java实现对.tar.Z文件的解压缩
- 为什么println()方法没有自动调用toString()方法?
- 简单问题,放分
- 请问JB有没有将应用程序转化为WIN下双击即可可执行的功能?
- 求救关于sfv结尾的的文件
- Frame中为什么setLayout(null)时无法显示Choice????
- 如何用截取到的字符串计算考勤(大牛都来啊,帮帮小弟)
tick假设是90a中tick--,该打印90,tick变成89,还没有打印90,OK,此时cpu切换线程执行b开始执行,tick--,该打印89,tick变成88,此时b时间片可能分的多一点又或者b运行的快一点,b线程打印出了89,OK,此时线程再切换a开始执行,上次a还留了个90没打印,此时打印90
于是就出现了89在前,90在后的现象
不加同步快:public class AB {
public static void main(String[] args) {
A s = new A();
Thread t1 = new Thread(s,"售票口->>1");
Thread t2 = new Thread(s,"售票口->>2");
Thread t3 = new Thread(s,"售票口->>3");
Thread t4 = new Thread(s,"售票口->>4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}class A implements Runnable {
private int tick = 10; public void run() {
for(int i = 0;i<100;i++){
if (tick > 0) {
try{
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "......."
+ tick--);
}
}
}
}
输出:售票口->>4.......10
售票口->>2.......9
售票口->>1.......8
售票口->>3.......7
售票口->>4.......6
售票口->>1.......5
售票口->>3.......4
售票口->>2.......3
售票口->>4.......2
售票口->>2.......1
售票口->>3.......0
售票口->>1.......-1
售票口->>4.......-2
加上同步代码块:
package study;public class AB {
public static void main(String[] args) {
A s = new A();
Thread t1 = new Thread(s,"售票口->>1");
Thread t2 = new Thread(s,"售票口->>2");
Thread t3 = new Thread(s,"售票口->>3");
Thread t4 = new Thread(s,"售票口->>4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}class A implements Runnable {
private int tick = 10; public void run() {
synchronized (this) {
for(int i = 0;i<100;i++){
if (tick > 0) {
try{
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "......."
+ tick--);
}
}
}
}
}
输出结果:
售票口->>1.......10
售票口->>1.......9
售票口->>1.......8
售票口->>1.......7
售票口->>1.......6
售票口->>1.......5
售票口->>1.......4
售票口->>1.......3
售票口->>1.......2
售票口->>1.......1
这下楼主应该明白了吧
不是先打印tick 在执行减减吗,怎么可能出现三楼所说的"tick变成89,还没有打印90"这种情况呢 ??