State w java problem.

0

Witam, mam takie zadanie

Uruchamianie i zatrzymywanie równoległego działania kodów

Zbudować klasę StringTask, symulująca długotrwałe obliczenia, tu polegające na konkatenacji napisow.
Konstruktor klasy otrzymuje jako argument napis do powielenia oraz liczbę oznaczającą ile razy ten napis ma być powielony.
Klasa winna implementować interfejs Runnable, a w jej metodzie run() wykonywane jest powielenia napisu, przy czym to powielenia ma się odbywac za pomoca operatora '+' stosowanego wobec zmiennych typu String (to właśnie długotrwała operacja). Użycie '+' jest warunkiem obowiązkowe.

Obiekt klasy StringTask traktujemy jako zadanie, które może się wykonywać równolegle z innymi.
Możliwe stany zadania to:
CREATED  - zadanie utworzone, ale nie zaczęło się jeszcze wykonywać,
RUNNING - zadanie się wykonuje w odrebnym wątku
ABORTED - wykonanie zadania zostało przerwane
READY - zadanie zakończyło się pomyślnie i sa gotowe wyniki.
W klasie StringTask zdefiniować metody:
  public String getResult()  - zwracającą wynik konkatenacji
  public TaskState getState()  - zwracającą stan zadania
  public void start() - uruchamiającą zadanie w odrębnym watku
  public void abort() - przerywającą wykonanie kodzu zadania i działanie watku
  public boolean isDone()  - zwracająca true, jeśli wykonanie zadania się zakończyło normalnie lub przez przerwanie, false w przeciwnym razie
Poniższy kod program:
public class Main {

  public static void main(String[] args) throws InterruptedException {
    StringTask task = new StringTask("A", 70000);
    System.out.println("Task " + task.getState());
    task.start();
    if (args.length > 0 && args[0].equals("abort")) { 
    /*<- tu zapisać kod  przerywający działanie tasku po sekundzie 
         i uruchomic go w odrębnym wątku
    */
    }
    while (!task.isDone()) {
      Thread.sleep(500);
      switch(task.getState()) {
        case RUNNING: System.out.print("R."); break;
        case ABORTED: System.out.println(" ... aborted."); break;
        case READY: System.out.println(" ... ready."); break;
        default: System.out.println("uknown state");
      }
      
    }
    System.out.println("Task " + task.getState());
    System.out.println(task.getResult().length());
  }

}

uruchominy bez argumentu powinien wyprowadzić coś w rodzaju:
Task CREATED
R.R.R.R.R.R.R.R.R. ... ready.
Task READY
70000

a uruchomiony z argumentem "abort" może wyprowadzić:
Task CREATED
R. ... aborted.
Task ABORTED
31700

Uwaga 1. Plik Main.java może być modyfikowany tylko w miejscu oznaczonym /*<- */
Uwaga 2. Nie wolno uzywac metody System.exit(...)


A to mój kod

package zad2;

import zad2.StringTask.State;

public class StringTask extends Thread implements Runnable {
	private String slowo;
	private int ile;
	volatile State status ;
	private String wynik;
	public enum State {
		CREATED, RUNNING ,ABORTED ,READY 
	}
	public StringTask(String string, int i) {
		this.slowo = string;
		this.ile = i;
		status = State.CREATED;
	}

	public State getState() {
		
		return status;
	}

	public boolean isDone() {
		if(wynik.length()==ile){
		return true;
		}else
		return false;
	}

	public String getResult() {
		
		return wynik;
	}
	public void run(){
		for(int i = 0; i > ile ; i++){
			wynik = wynik  + slowo + " ";
			this.status = State.READY;
		}
	}

}

Mam problem w metodzie getState, mam zły typ zwracania, to mówi Eclips, proszę o pomoc.

0

Rozszerzasz klasę Thread i Twoja metoda getState() gryzie się z taką samą metodą z rozszerzanej klasy. Nie ma w poleceniu mowy o rozszerzaniu tej klasy.

0

Ok, pomogło, dzięki wielkie.

0

Aktualnie to wyglada tak

package zad2;

public class StringTask  implements Runnable {
	private String slowo;
	private int ile;
	volatile TaskState status = TaskState.ABORTED;
	private String wynik;
	private boolean done = false;
	public enum TaskState {
		CREATED, RUNNING ,ABORTED ,READY 
	}
	public StringTask(String string, int i) {
		this.slowo = string;
		this.ile = i;
		this.status = TaskState.CREATED;
	}

	public TaskState getState() {
		
		return this.status;
	}

	public boolean isDone() {
		
		return this.done;
	}

	public String getResult() {
		 
		return wynik;
	}
	public void run(){
		for(int i = 0; i < ile ; i++){
			wynik = wynik  + slowo + " ";
			}
		
		this.status = TaskState.READY;
	}

	public void start() {
		Thread thread = new Thread(this);
        thread.run();
		
	}

	public void abort() throws Throwable {
        this.done= true;
        this.status = TaskState.ABORTED;
        this.finalize();
		
	}

}

I na konsoli jest

Task CREATED
 ... ready.
 ... ready.
 ... ready.
 ... ready.
 ... ready.
 ... ready.

i ...ready jest w kółko, gdzie mi się coś niedomyka?

0
public class Main {
  @SuppressWarnings("deprecation")
public static void main(String[] args) throws Throwable {
    StringTask task = new StringTask("A", 7);
    System.out.println("Task " + task.getState());
    task.start();
    if (args.length > 0 && args[0].equals("abort")) {
        Thread.sleep(1000);
        task.abort();
       
        task.start();
    /*<- tu zapisać kod  przerywający działanie tasku po sekundzie
         i uruchomić go w odrębnym wątku
    */
    }
    while (!task.isDone()) {
      Thread.sleep(500);
      switch(task.getState()) {
        case RUNNING: System.out.print("R."); break;
        case ABORTED: System.out.println(" ... aborted."); break;
        case READY: System.out.println(" ... ready."); break;
        default: System.out.println("unknown state");
      }
 
    }
    System.out.println("Task " + task.getState());
    System.out.println(task.getResult().length());
  }
}
0

Nie ustawiasz RUNNING.
Masz thread.run() zamiast start().
Źle dopisujesz String do wyniku.
Edit:
Ze stringiem jest taki problem, że później liczysz jego długość. Dodając " " zwiększasz ją o 1 więc zamiast 70000 dostaniesz 140000.

0

nie wypisuje mi statutu i nie wiem czemu kod wygląda tak:

package zad2;

public class Main {
public static void main(String[] args) throws InterruptedException {
StringTask task = new StringTask("A", 70000);
System.out.println("Task " + task.getState());
task.start();
if (args.length > 0 && args[0].equals("abort")) {

	Thread.sleep(1000);
	task.abort();
	task.start();
	
	
	
/*<- tu zapisać kod  przerywający działanie tasku po sekundzie 
     i uruchomić go w odrębnym wątku
*/
}
while (!task.isDone()) {
  Thread.sleep(500);
  switch(task.getState()) {
    case RUNNING: System.out.print("R."); break;
    case ABORTED: System.out.println(" ... aborted."); break;
    case READY: System.out.println(" ... ready."); break;
    default: System.out.println("unknown state");
  }

}
System.out.println("Task " + task.getState());
System.out.println(task.getResult().length());

}
}

package zad2;

public class StringTask implements Runnable {
private String s;
private String rezultat="";
private boolean done = false;
private int a;
public State status;
public enum State {
CREATED, RUNNING, ABORTED, READY
}
public StringTask(String s, int a){
this.s=s;
this.a=a;
status=State.CREATED;

}
public void run(){
	this.status=State.RUNNING;
	for(int i=0;i<a;i++){
		rezultat=rezultat+s;
	}
	
	this.status=State.READY;
	done =true;
	
}
public void start(){
	Thread thread = new Thread(this);
	thread.run();
}
public void abort(){
	this.done=true;
	this.status = State.ABORTED;
}
public State getState(){
	return this.status;
}
public boolean isDone(){
	return this.done;
}
public String getResult(){
	return rezultat;
}

}

ktoś może pomóc?

0

Task CREATED
Task READY
70000

tylko to na konsoli mam

1 użytkowników online, w tym zalogowanych: 0, gości: 1