相关疑难解决方法(0)

yield()的主要用途是什么,它与join()和interrupt()有什么不同?

我yield()对Java 中方法的使用有点困惑,特别是在下面的示例代码中.我还读过yield()'用于防止执行线程'.

我的问题是:

  1. 我相信下面的代码在使用yield()和不使用时都会产生相同的输出.它是否正确?

  2. 事实上,什么是主要用途yield()?

  3. 在哪些方面与方法yield()不同?join()interrupt()

代码示例:

public class MyRunnable implements Runnable {

   public static void main(String[] args) {
      Thread t = new Thread(new MyRunnable());
      t.start();

      for(int i=0; i<5; i++) {
          System.out.println("Inside main");
      }
   }

   public void run() {
      for(int i=0; i<5; i++) {
          System.out.println("Inside run");
          Thread.yield();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

使用和不使用上面的代码我获得相同的输出yield():

Inside main
Inside main
Inside main
Inside main
Inside main
Inside run
Inside run
Inside run
Inside …
Run Code Online (Sandbox Code Playgroud)

java multithreading yield-keyword concurrent-programming

98
推荐指数
4
解决办法
10万
查看次数

Forked IORef阅读器功能似乎停止主线程

我正在做一些并发和内存可见性的实验,并遇到了这种奇怪的行为(请参阅注释内联):

module Main
    where

import Data.IORef
import Control.Concurrent
import System.CPUTime

import System.IO

main = do
    hSetBuffering stdout NoBuffering

    r <- newIORef False
    putStrLn "forking..."  -- PRINTED
    forkIO $ f r
    threadDelay 1000000

    putStrLn "writeIORef"  -- NEVER PRINTED
    writeIORef r True

    threadDelay maxBound

f :: IORef Bool -> IO ()
f r = readIORef r >>= \b-> if b then print "NEVER PRINTED" else f r
Run Code Online (Sandbox Code Playgroud)

我希望writeIORef孩子线程可能看不到,但主线程不能简单地(显然)停止.

编译于ghc 7.8.3

 cabal exec ghc -- --make -fforce-recomp -O2 -threaded visibility.hs  
Run Code Online (Sandbox Code Playgroud)

并运行 …

concurrency haskell ghc ioref

5
推荐指数
1
解决办法
112
查看次数