当前位置: 代码迷 >> J2SE >> runnable解决办法
  详细解决方案

runnable解决办法

热度:59   发布时间:2016-04-24 00:37:49.0
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 块。
  相关解决方案