2016-01-18 39 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

相关问题