|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
[JAVA]Come blocco un thread?
Ho un thread in stato di runnable, devo fare in modo però che dopo aver eseguito il codice del metodo run() si fermi fino a quando non glielo dico io, cioè vorrei avere la possibilità di sospendere il thread e risvegliarlo quando mi pare.
Quello che potrebbe fare al caso mio è yeld() ma non va bene perchè non ho altri thread a cui passare il comando...non esiste un modo per bloccare un thread? Ovviamente questo non va bene: Codice:
Thread t =new Thread(){
public void run(){
while(true){
if(ok){
...esegui codice...
}
}
}
};
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Ho fatto del casino forse, allora vorrei fare una cosa del genere:
Codice:
Thread t =new Thread(){
public void run(){
...esegui codice...
sospendi(); //sospende il thread finchè non viene risvegliato
}
};
public void risveglia(){
...codice... //fa rieseguire il metodo run()
}
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Quote:
Codice:
Thread t =new Thread(){
private Object monitor=new Object();
private bool suspended=false;
public void suspend(){ suspended = true;}
public void notify(){ suspended = false; monitor.notify();}
public void run(){
while(true){
if(suspended){
try{
monitor.wait();
}catch(InterruptedException ecxeption){
...
}
}
...esegui codice...
}
}
};
Ultima modifica di The3DProgrammer : 28-07-2006 alle 17:23. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Ti ringrazio, non sapevo della possibilità di usare un oggetto in questo modo!
Grazie! |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Mi solleva l'eccezzione "current thread not owner", per quale motivo?
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Quote:
spe su quale riga? sono un po intontito (appena svegliato) quindi sicuramente ho scordato qualkosa |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
su monitor.wait()
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
ma ke kakkio ho scritto
aspe che ti posto la versione corretta....
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Ho trovato questa che fa uso di syncronized:
Codice:
// Create and start the thread
MyThread thread = new MyThread();
thread.start();
while (true) {
// Do work
// Pause the thread
synchronized (thread) {
thread.pleaseWait = true;
}
// Do work
// Resume the thread
synchronized (thread) {
thread.pleaseWait = false;
thread.notify();
}
// Do work
}
class MyThread extends Thread {
boolean pleaseWait = false;
// This method is called when the thread runs
public void run() {
while (true) {
// Do work
// Check if should wait
synchronized (this) {
while (pleaseWait) {
try {
wait();
} catch (Exception e) {
}
}
}
// Do work
}
}
}
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
infatti
devi semplicemente mettere le chiamate a wait() e notify() tra 2 blokki synchronized(monitor) altrimenti come diventa il thread owner del monitor? ciao e scusa, la sonnolenza fa brutti skerzi Ultima modifica di The3DProgrammer : 28-07-2006 alle 18:30. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Codice:
Thread t =new Thread(){
private Object monitor=new Object();
private bool suspended=false;
public void suspend(){ suspended = true;}
public void notify(){
suspended = false;
synchronized(monitor){
monitor.notify();
}
}
public void run(){
while(true){
if(suspended){
try{
synchronized(monitor){
monitor.wait();
}
}catch(InterruptedException ecxeption){
...
}
}
...esegui codice...
}
}
};
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Ok grazie mille!
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quel suspended deve essere volatile o il suo valore deve essere mutato all'interno di un blocco sincronizzato altrimenti non c'è garanzia che il valore di suspended letto dal Thread in attesa al momento del risveglio sia l'ultimo valore immesso da un Thread concorrente.
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2002
Città: Cosenza --> Roma
Messaggi: 853
|
Codice:
Thread t =new Thread(){
private Lock monitor=new ReentrantLock();
private boolean suspended=false;
private Condition wait = monitor.newCondition();
public void suspend(){
monitor.lock();
try {
suspended = true;
} finally {
monitor.unlock();
}
}
public void notify(){
monitor.lock();
try {
suspended = false;
wait.signal();
} finally {
monitor.unlock();
}
}
public void run(){
while(true){
monitor.lock();
try {
while (suspendend)
wait.await();
}catch(InterruptedException ecxeption){
...
} finally {
monitor.unlock();
}
...esegui codice...
}
}
};
__________________
GNU MyServer Wants YOU!! We live thinking we will never die. We die thinking we had never lived. Jason Becker Ultima modifica di cisc : 29-07-2006 alle 12:07. |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Quote:
hai perfettamente ragione. suspended è una variabile a cui si accede in concorrenza, per cui deve essere inserita in un blocco synchronized. In questo caso basta rendere synchronized i metodi suspend e notify (che tra l'altro come nomi di metodi nn vanno bene xkè significherebbe overriding di metodi final, ero proprio intronato ieri ciauz |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Quote:
|
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Ho fatto così:
Codice:
synchronized(controllo){
synchronized(this){
if(sospeso){
try{
controllo.wait();
}
catch(InterruptedException e){System.out.println(e);}
}
}
}
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Quote:
così nn si sveglia + xkè il thread, entrando in wait, rilascia la ownership sul monitor controllo ma nn sull'altro (this) cosa che provoca l'impossibilità di accedere a controllo.notify() da parte degli altri thread concorrenti. Dovresti fare una cosa del genere: [code] Codice:
while(true){
boolean mustWait=false;
synchronized(this){
mustWait=sospeso;
}
if(mustWait){
synchronized(controllo){
try{
controllo.wait();
}
catch(InterruptedException e){System.out.println(e);}
}
}
}
ciauz Ultima modifica di The3DProgrammer : 29-07-2006 alle 15:56. |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
ora che guardo bene anche quella ke hai postato xò elimina quegli abberranti
Codice:
synchronized(thread){
thread.pleaseWait=x;
}
e metti 2 metodi synchronized, ma soprattutto metti pleaseWait privata ciau Ultima modifica di The3DProgrammer : 29-07-2006 alle 15:49. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:10.



















