thread anhalten und wieder starten

Hallo!

So so, also wäre die Methode inc2 besser als die Methode inc ? Das denke ich nicht...
Wie gesagt wenn die Attribute eines Objektes innerhalb des Objektes verwendet werden reicht IMHO ein einfacher Verweis mit this... solange keine Zusatzlogik in die get/set Methoden gesteckt worden ist. Soll von "außen" von einem Fremden Objekt auf ein Attribut eines anderen Objektes zugegriffen werden, so sollte der Zugriff natürlich über getter/setter erfolgen.
Code:
/**
 * 
 */
package de.tutorials;

/**
 * @author Administrator
 * 
 */
public class Foo {

	private int value;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(new Foo().inc());
		System.out.println(new Foo().inc2());
	}

	private int inc() {
		return ++this.value;
	}

	private int inc2() {
		setValue(getValue() + 1);
		return getValue();
	}

	private int getValue() {
		return value;
	}

	private void setValue(int value) {
		this.value = value;
	}
}

Gruß Tom
 
Thomas Darimont hat gesagt.:
Hallo!

So so, also wäre die Methode inc2 besser als die Methode inc ? Das denke ich nicht...
Wie gesagt wenn die Attribute eines Objektes innerhalb des Objektes verwendet werden reicht IMHO ein einfacher Verweis mit this... solange keine Zusatzlogik in die get/set Methoden gesteckt worden ist. Soll von "außen" von einem Fremden Objekt auf ein Attribut eines anderen Objektes zugegriffen werden, so sollte der Zugriff natürlich über getter/setter erfolgen.
Gruß Tom

Einverstanden. Schließlich sollte ein Objekt die eigenen (!) Variablen kennen und damit auch ansprechen dürfen.
 
Hehehe,

was für eine Diskussion ;)

Natürlich sollte man den Code sauber halten und sich an gewisse OO-Praktiken halten, im Endeffekt ist es aber jedem sein eigener Stil und man sollte es so lassen, wenn sich derjenige damit wohlfühlt (lesbarkeit ist wieder ein anderes Thema). Hab in meinem bisherigen leben soviel "Code-Müll" vom stil her gesehen, das ich denke schlimmer gehts immer....

Muss zugeben, das ich bis vor 2 Jahren auch kein sauberer Programmierer war, habe allerdings eingesehen, dass einige Konzepte und Stile einzuhalten sind, damit man später selbst noch durchsteigt ;)

Gruss
Torsten
 
Wartbarkeit und Fehleranfälligkeit sind ausreichende Gründe. Mir ist allerdings schon klar, dass man niemanden dazu zwingen kann, sauber OO zu programmieren.
 
Hi,

ich habe ein ähnliches Problem, aber erst mal mein Code.

Code:
/**
	 * 
	*/
	public void mousePressed(MouseEvent arg0) {
			
		System.out.println("Wie oft wirst du eigentlich....");
		
		timer = new Thread() {					
			public void run() {
			        while(true) {

                                        if(isInterrupted())
					         break;
					try {
						sleep(1000L);
						showNext();	
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}													
				}						
			}					
		};
		timer.start();								
	}
			
	/**
	 * 
	 */
	public void mouseReleased(MouseEvent arg0) {
		System.out.println("Timer gestoppt");
		timer.interrupt();				
	}

Ziel:
Wenn die Maustaste gedrückt und gehalten wird, soll er alle 1000 Millisekunden (?) die Funktion showNext() aufrufen. Sobald die Maustaste losgelassen wird, soll er damit aufhören.

Problem:
Obwohl die Ausgabe "Timer gestoppt" auf die Konsole kommt, läuft der Thread immer weiter, wenn die Maustaste losgelassen wird. Wieso?
 
Zuletzt bearbeitet:
Hallo!

Also ich würde da soch machen:
Java:
/**
 * 
 */
package de.tutorials;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.Timer;

/**
 * @author Tom
 *
 */
public class RestartableTimerExample extends JFrame{

    Timer timer;
    JButton btnTimerControl;
    JTextField txtTime;
    
    public RestartableTimerExample(){
        super("RestartableTimerExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        timer = new Timer(250,new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                txtTime.setText("" + System.currentTimeMillis());
            }
        });
        
        btnTimerControl = new JButton("Start");
        btnTimerControl.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                if(timer.isRunning()){
                    timer.stop();
                    btnTimerControl.setText("Start");
                }else{
                    timer.start();
                    btnTimerControl.setText("Stop");
                }
            }
        });
        
        txtTime = new JTextField(20);
        add(txtTime,BorderLayout.NORTH);
        add(btnTimerControl,BorderLayout.SOUTH);
        
        pack();
        setVisible(true);
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        new RestartableTimerExample();
    }

}

Gruß Tom
 
Hallo zusammen,

diesen Code führt zu dem gleichen Ergebnis:
man sollte das Lock so kurz wie möglich halten,
und im finally Block wieder freigeben..

Java:
package de.tutorials;

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author Thomas Darimont
 * 
 */
public class ThreadExample {

    private Lock lock = new ReentrantLock();

    private Thread runner = new Thread() {
        public void run() {
            int i = 0;
            while (true) {
                try {
                    lock.lock();
                    System.out.println(i++);
                } finally {
                    lock.unlock();
                }
                try {
                    sleep(500L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };

    /**
     * @param args
     */
    public static void main(String[] args) {
        new ThreadExample().doIt();
    }

    private void doIt() {
        runner.start();
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            public void run() {
                try {
                    lock.lock();
                    for (int i = 0; i < 10; i++) {
                        System.out.print("bla: ");
                        System.out.println(i);
                        try {
                            Thread.sleep(100L);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                } catch (RuntimeException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        };
        timer.schedule(task, 5000L); // In 5 Sekunden starten...
    }
}
 
Zurück