首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

runnable解决办法

2012-07-29 
runnable将共享数据和操作数据的方法一并封装到Runnable的实现子类中,然后在主方法中new其实例对象,将这个

runnable
将共享数据和操作数据的方法一并封装到Runnable的实现子类中,然后在主方法中new其实例对象,将这个实例对象传个创建的两个匿名Thread对象,并开启运行。为何出现诡异的结果呢?麻烦大家帮忙看看!谢谢先! 

Java code
public class SaleTickets{        //static Tickets  tickets = new Tickets();//这里和(1)处除了他是随类的创建而创建,                                                //存储在静态区,以及共享外还有什么区别吗?        public static void main(String[] args) {                 Tickets  tickets = new Tickets();//(1)                new Thread(tickets).start();//调用tickets身上的run方法将count--            new Thread(tickets).start();//也是调用tickets身上的run方法将count--        }}//将共享数据和操作数据的方法一并封装到Runnable的实现子类中class Tickets implements Runnable{        private int count = 10000;        @Override        public /*synchronized*/ void  run(){//这里为何加上同步另外一个进程就无法启动呢?                while(true){                 count--;                 System.out.println(Thread.currentThread().getName()+"|"+count);                }        }}




[解决办法]
最基础的,一点也不诡异
复制一段话给你,自己看吧。。。。。。。

synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。

热点排行