2016-01-18 37 views
-2
package com.nodic.test; 

import java.util.Random; 

public class StopThread { 
    private static User user = new User(); 

    public static class User { 
    private int id; 
    private String name; 

    public User() { 
     id = 1; 
     name = "1"; 
    } 

    @Override 
    public String toString() { 
     return "{id=" + id + ", name=\"" + name + "\"}"; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 
    } 

    public static class WriteThread implements Runnable { 
    @Override 
    public void run() { 
     while(true) { 
     synchronized (user) { 
      int curr_id = new Random().nextInt(); 

      user.setId(curr_id); 

      try { 
      Thread.sleep(10000); 
      } catch (InterruptedException e) { 
      e.printStackTrace(); 
      } 

      user.setName(String.valueOf(curr_id)); 
     } 

     Thread.yield(); 
     } 
    } 
    } 

    public static class ReadThread implements Runnable { 
    @Override 
    public void run() { 
     while (true) { 
     synchronized (user) { 
      if(!user.getName().equals(String.valueOf(user.getId()))) { 
      System.out.println(user.toString()); 
      break; 
      } 
     } 

     Thread.yield(); 
     } 
    } 
    } 

    public static void main(String[] args) { 
    new Thread(new ReadThread(), "Thread-StopThread-ReadThread").start(); 

    int count = 0; 

    while(count < 50) { 
     Thread t = new Thread(new WriteThread(), "Thread-StopThread-WriteThread"); 
     t.start(); 

     t.stop(); 

     count ++; 
    } 
    } 
} 

HI每一個,當我運行這個類jdk1.8.0_45,爲什麼我總是得到這個錯誤:java.lang.NoClassDefFoundError:莫非無法初始化類java.util.Random中java.lang.NoClassDefFoundError:無法初始化類java.util.Random中

/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java -Didea.launcher.port=7534 "-Didea.launcher.bin.path=/Applications/IDE/IntelliJ IDEA /IntelliJ IDEA 14.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Users/huangshiqian/Workspaces/IDEA/Test/concurrent/target/classes:/Users/huangshiqian/.m2/repository/junit/junit/4.9/junit-4.9.jar:/Users/huangshiqian/.m2/repository/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar:/Applications/IDE/IntelliJ IDEA /IntelliJ IDEA 14.app/Contents/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain com.nodic.test.StopThread

Exception: java.lang.ThreadDeath thrown from the UncaughtExceptionHandler in thread "Thread-StopThread-WriteThread"

Exception: java.lang.ThreadDeath thrown from the UncaughtExceptionHandler in thread "Thread-StopThread-WriteThread" Exception in thread "Thread-StopThread-WriteThread" Exception in thread "Thread-StopThread-WriteThread" Exception: java.lang.ThreadDeath thrown from the UncaughtExceptionHandler in thread "Thread-StopThread-WriteThread" Exception in thread "Thread-StopThread-WriteThread" Exception in thread "Thread-StopThread-WriteThread" Exception in thread "Thread-StopThread-WriteThread" Exception in thread "Thread-StopThread-WriteThread" Exception: java.lang.ThreadDeath thrown from the UncaughtExceptionHandler in thread "Thread-StopThread-WriteThread"

Exception: java.lang.ThreadDeath thrown from the UncaughtExceptionHandler in thread "Thread-StopThread-WriteThread"

Exception: java.lang.ThreadDeath thrown from the UncaughtExceptionHandler in thread "Thread-StopThread-WriteThread"

Exception: java.lang.ThreadDeath thrown from the UncaughtExceptionHandler in thread "Thread-StopThread-WriteThread"

Exception: java.lang.ThreadDeath thrown from the UncaughtExceptionHandler in thread "Thread-StopThread-WriteThread" Exception in thread "Thread-StopThread-WriteThread" java.lang.NoClassDefFoundError: Could not initialize class java.util.Random at com.nodic.test.StopThread$WriteThread.run(StopThread.java:44) at java.lang.Thread.run(Thread.java:745) Exception in thread "Thread-StopThread-WriteThread" java.lang.NoClassDefFoundError: Could not initialize class java.util.Random at com.nodic.test.StopThread$WriteThread.run(StopThread.java:44) at java.lang.Thread.run(Thread.java:745) Exception in thread "Thread-StopThread-WriteThread" java.lang.NoClassDefFoundError: Could not initialize class java.util.Random at com.nodic.test.StopThread$WriteThread.run(StopThread.java:44) at java.lang.Thread.run(Thread.java:745) Exception in thread "Thread-StopThread-WriteThread" java.lang.NoClassDefFoundError: Could not initialize class java.util.Random at com.nodic.test.StopThread$WriteThread.run(StopThread.java:44) at java.lang.Thread.run(Thread.java:745) Exception in thread "Thread-StopThread-WriteThread" java.lang.NoClassDefFoundError: Could not initialize class java.util.Random at com.nodic.test.StopThread$WriteThread.run(StopThread.java:44) at java.lang.Thread.run(Thread.java:745) Exception in thread "Thread-StopThread-WriteThread" java.lang.NoClassDefFoundError: Could not initialize class java.util.Random at com.nodic.test.StopThread$WriteThread.run(StopThread.java:44) at java.lang.Thread.run(Thread.java:745) Exception in thread "Thread-StopThread-WriteThread" java.lang.NoClassDefFoundError: Could not initialize class java.util.Random at com.nodic.test.StopThread$WriteThread.run(StopThread.java:44) at java.lang.Thread.run(Thread.java:745) Exception in thread "Thread-StopThread-WriteThread" java.lang.NoClassDefFoundError: Could not initialize class java.util.Random at com.nodic.test.StopThread$WriteThread.run(StopThread.java:44) at java.lang.Thread.run(Thread.java:745) Exception in thread "Thread-StopThread-WriteThread" java.lang.NoClassDefFoundError: Could not initialize class java.util.Random at com.nodic.test.StopThread$WriteThread.run(StopThread.java:44)

+1

不設置JAVA_HOME什麼問題嗎? – SMA

+3

永遠不要使用Thread.stop()。閱讀它的javadoc。 –

+0

你不包括java.lang.Thread中,你沒有處理任何異常,這可能是你的問題,我也同意SMA,你確定你已經設置JAVA_HOME? –

回答

2

你最有可能在一個線程中調用stop(),而它運行的Random類的靜態初始化。

  • JVM只試圖初始化一個類。

  • 如果一個類初始化失敗(因爲一個異常被拋出)時,JVM將其標記,並依賴於它......作爲「壞」的任何類。如果您嘗試使用它/它們,你會得到一個ClassDefNotFoundError

  • Thread.stop()的實現將導致ThreadDeath異常在目標線程的堆棧上拋出。

總之,這是說明爲什麼呼叫Thread.stop()是不安全的一個例子。

+0

謝謝,非常感謝 – user3492549

相關問題