Kann ich einen "toten Thread" zurück ins Leben holen?

IZZO

Mitglied
Ich beende einen Thread mit stop(). Danach brauch ich ihn aber wieder :/. Mit interrupted funktioniert das ganze nicht.
Fokus liegt auf Zeile 122 - 136

Java:
package mainPack;

/**
 * @author 
 *
 */

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JTextField;


public class Hauptklasse implements ActionListener {

	
	
	JFrame frame = new JFrame();
	JFrame frame2 = new JFrame();
	JTextField orb = new JTextField();
	JTextField trb = new JTextField();
	JTextField obf = new JTextField();
	JTextField tbf = new JTextField();
	JTextField nash = new JTextField();
	JTextField drag = new JTextField();
	JButton ourredbuff = new JButton("ORB");
	JButton intourredbuff = new JButton("INT");
	
	JButton theirredbuff = new JButton("TRB");
	JButton ourbluebuff = new JButton("OBB");
	JButton theirbluebuff = new JButton("TBB");
	JButton dragon = new JButton("DRA");
	JButton nashor = new JButton("NAS");
	
	//JButton decoratedframe = new JButton("DEK");
	//JButton decoratedframe2 = new JButton("DEK2");
	
	
	
	Thread cd1 = new Thread() {
		public void run() { new Countdown(orb,5,0);}
	};
	Thread cd2 = new Thread() {
		public void run() { new Countdown(trb,5,0);}
	};
	Thread cd3 = new Thread() {
		public void run() { new Countdown(obf,5,0);}
	};
	Thread cd4 = new Thread() {
		public void run() { new Countdown(tbf,5,0);}
	};
	Thread cd5 = new Thread() {
		public void run() { new Countdown(drag,6,0);}
	};
	Thread cd6 = new Thread() {
		public void run() { new Countdown(nash,7,0);}
	};
	
	

	
	public Hauptklasse(){	
		
		frame.setBounds(0,0,600,150);
		frame.setLayout(null);
		frame.setAlwaysOnTop(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setUndecorated(false);
		frame.setVisible(true);

		buttonserstellen(ourredbuff, Color.RED, 0, 70, 80, 50);
		buttonserstellen(theirredbuff,Color.RED, 100, 70, 80, 50);
		buttonserstellen(ourbluebuff,Color.BLUE, 200, 70, 80, 50);
		buttonserstellen(theirbluebuff,Color.BLUE, 300, 70, 80, 50);
		buttonserstellen(dragon,Color.BLACK, 400, 70, 80, 50);
		buttonserstellen(nashor,Color.PINK, 500, 70, 80, 50);
		buttonserstellen(intourredbuff,Color.WHITE,0,20,80,50);
		
		ourbluebuff.setForeground(Color.WHITE);
		theirbluebuff.setForeground(Color.WHITE);
		dragon.setForeground(Color.WHITE);

		cdtf(  0,0,80,18,orb);
		cdtf(100,0,80,18,trb);
		cdtf(200,0,80,18,obf);
		cdtf(300,0,80,18,tbf);
		cdtf(400,0,80,18,drag);
		cdtf(500,0,80,18,nash);
		
		

	}

	
	public void buttonserstellen(JButton button, Color bla, int xplace, int yplace, int height, int width){
		button.setBounds(xplace,yplace,height,width);
		button.addActionListener(this);
		button.setBackground(bla);
		frame.add(button);
		
	}
	
	

	public void cdtf(int xplacecoord, int yplacecoord, int height, int width, JTextField countdowntextfeld){
			
		frame.add(countdowntextfeld);
		
		countdowntextfeld.setBounds(xplacecoord,yplacecoord,height,width);
		countdowntextfeld.setFocusable(false);
		countdowntextfeld.setEditable(false);
		
	}
	
	
	  public void actionPerformed(ActionEvent e) { 
	        if(e.getSource() == ourredbuff){ 
		            System.out.println("orb");
		            cd1.start();
		            ourredbuff.setFocusable(false);
		            
	        }
	            
	        if(e.getSource() == intourredbuff){
	        	
	        	System.out.println("intorb");
	        	cd1.stop();
	        	orb.setText("5:00");
	        	intourredbuff.setFocusable(false);
	        	
	        }
	        
	        if(e.getSource() == theirredbuff){
	        	System.out.println("trb");
	        	cd2.start();
	        }
	        	
	        if(e.getSource() == ourbluebuff){
	 	        System.out.println("obb");
	 	        cd3.start();
	        }
	 	        	
	 	    if(e.getSource() == theirbluebuff){
	 		    System.out.println("tbb");
	 		    cd4.start();
	 	    }
	 		        	
	 		if(e.getSource() == dragon){
	 			System.out.println("drag");
	 			cd5.start();
	 		}
	 			        	
	 	    if(e.getSource() == nashor){
	 			System.out.println("nash");
	 			cd6.start();
	        
	        } 
	 	    
	 	  
	    } 
	  
	  
	 
	 
		/*public void keyPressed(KeyEvent e) {
			if(e.getKeyCode() == KeyEvent.VK_K){
				System.out.println("jojojoj");
				cd1.start();
			}
			
		}*/
	 
	
	 
	 
	public static void main(String[] args) {

		 new Hauptklasse();
		//new Countdown(orb, 5,0);
		//new CountdownThreads();
		
		

	}
}
 

sheel

I love Asm
Hi

ohne den Code genau angeschaut zu haben:

a) Einen Thread hält man nicht mit stop() an, das ist bestenfalls problematisch
Der Thread sollte sich möglichst selbst mit return beenden
(das kann ihm natürlich auch von anderen Threads aus mitgeteilt werden)

b) Nein, einen beendeten Thread kann man höchstens ganz neu starten.
An der Stelle, wo er mit stop() abgebrochen wurde, fortzusetzen ist nicht möglich.

c) Wenn du den Threadn nur an einer bestimmten Stelle pausieren willst
wäre eine einfache Möglichkeit, dass der Thread regelmäßig einen Mutex lockt und gleich danach
wieder freigibt. Um ihn von außen zu pasusieren lockt man den selben Mutex einfach
und gibt ihn erst wieder frei, wenn der Thread weitermachen darf.

d) Swing-Sachen in Threads "müssen" mit invoke... erfolgen.