簡體   English   中英

Java中的非法狀態異常

[英]Illegal State Exception in java

我在運行代碼時遇到此異常。 即使代碼運行正常,終端上也會出現一些異常

Exception in thread "AWT-EventQueue-1" java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Thread.java:708)
    at SR.start(SR.java:38)
    at SR.mouseClicked(SR.java:212)
    at java.awt.Component.processMouseEvent(Component.java:6536)
    at java.awt.Component.processEvent(Component.java:6298)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Window.processEvent(Window.java:2025)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at org.GNOME.Accessibility.AtkWrapper$5.dispatchEvent(AtkWrapper.java:700)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

我究竟做錯了什么??

我的start()方法

private void start() throws IllegalStateException {
    if (HelperThread == null)
        HelperThread = new Thread(this);
    HelperThread.start();
}

您似乎兩次啟動相同的Thread ,這是不允許的。

如果您想重用同一線程,則建議創建一個ExecutorService

問題是,如果HelperThread不為null(它已經存在)並且您調用HelperThread.start()會嘗試start()一個已經啟動或完成其處理的線程。 如果要重新開始處理,則必須先停止線程。 要優雅地執行此操作,請在實際線程中使用一會兒(正在運行){}模式。 然后,將start()方法設置為false,將標志設置為false,等待線程死亡,然后啟動一個新線程:

private void start() throws IllegalStateException {
    if (HelperThread != null) {
        running = false;
        HelperThread.join(); // wait for it to die...
    }

    // Start fresh...
    HelperThread = new Thread(this);
    HelperThread.start();
}

另外,請注意,避免將大寫字母用作變量的首字母。 它應該是“ helperThread”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM