【问题标题】:Methods in a Runnable class block when sleep is called in the run method?在 run 方法中调用 sleep 时 Runnable 类块中的方法?
【发布时间】:2014-04-26 10:24:53
【问题描述】:

我有一个实现 Runnable 接口的类:类似于:

    public class MyClass implements Runnable{

            public MyClass(){
            //I have a queue object
            mQueue = new LinkedList<MyObject>();

            }

            public void addToQueue(MyObject onj){
               mQueue.add(obj);
            }

            @Override
            public void run(){
               while(true)
               {
                     //Do some stuff(dequeue and write to file)
                     Thread.sleep(500);

               }
            }
         }
}

所以这个 runnabale 课程将在另一个课程中开始。添加到此队列(也已启动 Runnable)的类将始终添加到队列中。

我想知道while循环什么时候调用sleep,方法addToQueue还能用吗?我的意思是当这个线程处于睡眠状态时,启动这个线程的类可以添加到队列中......所以基本上run()方法会阻塞类中的其他方法?

【问题讨论】:

    标签: java thread-safety queue runnable


    【解决方案1】:

    线程是独立的概念。类和方法不会阻塞;线程可以。

    如果你有这个:

        MyClass mc = new MyClass();
        mc.run();   // this will never return
    

    这段代码在单线程中运行; Thread.sleep(500) 在线程中运行并在每次调用时阻塞线程。当线程处于休眠状态时,线程中的执行将停止。 (事实上​​,mc.run() 永远不会返回,因为它是无限循环的。)

    但是,如果多个线程引用了特定的MyClass 实例,则每个线程都可以独立地调用对象上的方法。每个线程独立于其他线程执行(涉及同步时除外)。

        MyClass mc = new MyClass();
        Thread thread = new Thread(mc);
        thread.start();
        for (int i = 0; i < 100; ++i)
        {
            MyObject obj = new MyObject();
            mc.addToQueue(obj);
        }
    

    这段代码创建一个新线程(称为thread B)并启动它,这会导致run()mc 对象实例上的新线程中执行。现在有两个线程 - 原来的一个 thread A 和新的一个 thread B。两者都彼此独立执行。特别是,线程 A 可以在 线程 B 运行 run() 的同时(出于我们的目的)操作对象。如果您不小心避免潜在的冲突操作,您将遇到意想不到的结果和难以重现的故障。在您的代码中,如果多个线程可以在没有充分同步的情况下对给定对象调用addToQueue(),那么您最终会遇到麻烦,因为LinkedList 不是线程安全类。

    并发性和线程安全性很难做到正确。 Brian Goetz 等人的Java 并发实践一书。人。是一个很好的开始。

    【讨论】:

      【解决方案2】:

      尝试一下,但可以肯定的是,只要您在与调用该方法的代码不同的线程中调用 this,它应该仍然可以正常工作。此外,虽然真正的代码不应该调用会锁定使用您感兴趣的方法的同步代码。

      【讨论】:

      • 我无法访问自己的 PC...我正在考虑我的代码问题。我会检查,但我想听到坚如磐石的是或否:D
      • 你应该总是在询问之前进行测试。
      • @Sean87:但没有绝对的。在某些情况下,方法不会运行,您的代码会被锁定。
      • 什么样的条件,可能在while循环中有同步语句?
      猜你喜欢
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多