public class TrainTicketSell
{
public static int ticket=100;
public static void main(String args[])
{
new Sell().start();
new Sell().start();
new Sell().start();
new Sell().start();
}
}
class Sell extends Thread
{
public static String str=new String ("");
public void run()
{
synchronized(str)
{
while(TrainTicketSell.ticket>0)
System.out.println(Thread.currentThread().getName()+":"+TrainTicketSell.ticket--);
}
}
}
//不知道为什么只有一个线程在运行呀
{
public static int ticket=100;
public static void main(String args[])
{
new Sell().start();
new Sell().start();
new Sell().start();
new Sell().start();
}
}
class Sell extends Thread
{
public static String str=new String ("");
public void run()
{
synchronized(str)
{
while(TrainTicketSell.ticket>0)
System.out.println(Thread.currentThread().getName()+":"+TrainTicketSell.ticket--);
}
}
}
//不知道为什么只有一个线程在运行呀
解决方案 »
- 面试题求帮助~!对IO不是很了解,求大神帮忙~!
- 有没有什么方法可以删除当前ClassLoader中已加载过的类对象
- 求助P2P五子棋的测试
- JDBC连接SQL SERVER 2000报拒绝
- 请问我怎么样才能实现每格一段时间触发一个动作?java有没有类似其他语言中的OnTimer方法?
- 我可以访问任何的网站,就是访问不了www.sun.com,而且我能访问www.sun.com.cn。
- 关于用java写图片识别
- 高分请教JBuilder问题!
- 高手求救!关于jni 问题!
- Java 关于NUMA的参数有哪些?
- 如何用线程控制时间
- 在java1.6 JComboBox里只有一个元素的时候 为什么选中唯一的元素时ActionListener不响应呢? 如果有2个或2个以上元素选其中任何一个就可
synchronized(str)明白了吗?
第一个线程拿了他的锁,在没执行完之前是不会放这个锁的,那么其他线程都要等着.
等他执行完了,ticket也变0了,其他线程自然什么也不打印了
你在while之前随便加点打印语句看看.
//extends Thread方法
//implements Runnable方法
//关键:多个线程要去处理同一资源,同一个资源只能对应同一个对象。
//总结:使用Runnable接口适合于多个相同程序代码的线程去处理同一资源的情况,
//把虚拟CPU(线程)同程序的代码、数据(实现了Runnable接口的类)有效分离,
//体现了面向对象的设计思想。
//思考:如果实在想用extends Thread的方法创建4个线程卖同100张票呢?public class 习题10_线程应用_ThreadDemo
{
public static void main(String [] args)
{
ThreadTest t=new ThreadTest();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class ThreadTest implements Runnable
{
private int tickets=100;
public void run()
{
while(tickets>0)
{
System.out.println(Thread.currentThread().getName()
+ " is saling ticket " + tickets--);
}
}
}
/*
*可见,实现Runnable 接口相对于继承Thread类来说,有如下显著的好处:
1、适合多个相同程序代码的线程去处理同一资源的情况,把线程同程序的代码、
数据有效分离,较好地体现了面向对象的设计思想。
2、可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,
即当我们要将已经继承了某一个类的子类放入多线程中,
由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,
那么,这个类就只能采用实现Runnable接口的方式了。
*/
synchronized就是异步
线程只能一个一个进入资源的临界区,一个推出后,另一个才能进入
while(true) {
synchronized(str)
{
if(TrainTicketSell.ticket>0)
System.out.println(Thread.currentThread().getName()+":"+TrainTicketSell.ticket--);
else
break;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}这样四个进程都能打印相应的数据
public class TrainTicketSell
{
public static int ticket=100;
public static String str=new String ("");
public static void main(String args[])
{
new Sell().start();
new Sell().start();
new Sell().start();
new Sell().start();
}
}
class Sell extends Thread
{
public void run()
{
while(TrainTicketSell.ticket>0)
{
synchronized(TrainTicketSell.str)
{
//while(TrainTicketSell.ticket>0)
System.out.println(Thread.currentThread().getName()+":"+TrainTicketSell.ticket--);
}
}
}
}
public class TrainTicketSell
{
public static int ticket=100;
public static void main(String args[])
{
new Sell().start();
new Sell().start();
new Sell().start();
new Sell().start();
}
}
class Sell extends Thread
{
public String str=new String ("");
public void run()
{
synchronized(str)
{
while(TrainTicketSell.ticket>0) {
TrainTicketSell.ticket--;
System.out.println(Thread.currentThread().getName()+":"+TrainTicketSell.ticket);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
如果你想用把str改成成员变量,则你可以实现Runnable接口,这样也可以达到进程的同步
public class TrainTicketSell
{
public static int ticket=100;
public static void main(String args[])
{
new Sell().start();
new Sell().start();
new Sell().start();
new Sell().start();
}
}
class Sell extends Thread
{
public String str=new String ("");
public void run()
{
synchronized(str)
{
while(TrainTicketSell.ticket>0) {
TrainTicketSell.ticket--;
System.out.println(Thread.currentThread().getName()+":"+TrainTicketSell.ticket);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
这能打印出很多4个零
这时打印出来的结果是96 95 ....0 0 0 0
public class TrainTicketSell
{
public static int ticket=100;
public static void main(String args[])
{
new Sell().start();
new Sell().start();
new Sell().start();
new Sell().start();
}
}
class Sell extends Thread
{
public String str=new String ("");
public void run()
{
synchronized(str)
{
while(TrainTicketSell.ticket>0) {
TrainTicketSell.ticket--;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+TrainTicketSell.ticket);
}
}
}
}
1 是使用 有 synchronized标记 的方法
public synchronized void 方法名(){
}2 像你一样 使用synchronized(str) 锁定 线程共有的一个对象 str
就可以达到同步