Uruchamianie wątków

0

Witam, potrafię uruchomić wątku w tym kodzie

/**
 *
 *  @author Wieczorek Krzysztof S15877
 *
 */

package zad1;


public class Main {

  public static void main(String[] args) throws InterruptedException {
    Letters letters = new Letters("ABCD");
    for (Thread t : letters.getThreads()) System.out.println(t.getName());
    for (Thread t : letters.threads) {
    	t.start();
    }
    /*<- tu uruchomić 
         wszystkie kody w wÄ…tkach 
     */

    Thread.sleep(5000);
//    for (Thread t : letters.getThreads()){
//      t.interrupt();
//    }
    /*<- tu trzeba zapisać
       fragment, który kończy działanie kodów, wypisujących litery 
    */
    System.out.println("\nProgram skończył działanie");
  }

}

package zad1;

import java.util.ArrayList;

public class Letters implements Runnable {
		public ArrayList<Thread> threads = new ArrayList<Thread>();
		private ArrayList<String> znaki = new ArrayList<String>();

	public Letters(String string) {
		for(int i = 0; i < string.length(); i++){  
			 String leter = string.substring(i, i+1);
			znaki.add(leter);
			
	            threads.add(new Thread("Thread " + leter));
	            
	        }
	    }

	public ArrayList<Thread> getThreads() {
		// TODO Auto-generated method stub
		return threads;
	}
	public void run() {
	System.out.println("a");
	
	}
	

}

Dlaczego nie wyświetla mi tego "a"

0

Potrafisz i nawet uruchamiasz. Z tym że wątki nie uruchamiają nic specjalnego, bo tworzysz domyślne implementacje.

Spróbuj linijkę:
threads.add(new Thread("Thread " + leter));
Zamienić na:
threads.add(new Thread(this, "Thread " + leter));

0

Ok to wyświetliło mi "a"
A jak chce by dało to wynik takii

Thread A
Thread B
Thread C
Thread D
ACDBDBACACDBCBDA
Program skończył działanie.

to co muszę zmienić?

0

Po pierwsze musisz zrobić klasę która będzie wejściem dla wątku. Niech to będzie Letter rozszerzająca Runnable lub Thread i tworzona przy konstruktora przyjmującego 1 literę. Metoda run niech wyświetla tą literę.
Potem piszesz funkcję zamienia String na listę obiektów Letter które mają pozamykane w sobie poszczególne litery.
Na samym końcu w mainie uruchamiasz tą funkcję z podanym stringiem i albo uruchamiasz każdą klasę w przypadku gdy jest typu Thread, lub z każdą klasą tworzysz nowy wątek tak jak w moim poprzednim poście gdy użyjesz Runnable.

0


public class Main {

  public static void main(String[] args) throws InterruptedException {
    Letters letters = new Letters("ABCD");
    for (Thread t : letters.getThreads()) System.out.println(t.getName());
    for (Thread t : letters.threads) {
    	t.start();
    	try {
    		Thread.sleep(1000);
    	} catch (InterruptedException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    }
    /*<- tu uruchomić 
         wszystkie kody w wÄ…tkach 
     */

    Thread.sleep(5000);
//    for (Thread t : letters.threads) {
//    	letters.isDone();
//    }
    for (Thread t : letters.threads){
      letters.done();
    }
    /*<- tu trzeba zapisać
       fragment, który kończy działanie kodów, wypisujących litery 
    */
    System.out.println("\nProgram skończył działanie");
  }

}


=================



import java.util.ArrayList;


public class Letters implements Runnable {
		public ArrayList<Thread> threads = new ArrayList<Thread>();
		public ArrayList<String> znaki = new ArrayList<String>();
		private boolean isDone = false;

	public Letters(String string) {
		for(int i = 0; i < string.length(); i++){  
			 String leter = string.substring(i, i+1);
			znaki.add(leter);
			
			
	            threads.add(new Thread(this, "Thread " + leter));
	            //litery.put(threads.get(i), leter);
	        }
	    }

	public ArrayList<Thread> getThreads() {
		// TODO Auto-generated method stub
		return threads;
	}
	public void run() {
	
	threads.forEach(arg -> System.out.print(arg.getName().substring(7)));
	
	}
	public void done(){
		isDone = true;
		
	}

}


Zrobiłem tak i mi działa, tylko mam jeszcze jedno pytanie, dlaczego ja w run() dam pętle while(!isDone), to program chodzi ale na konsoli nic nie ma, tylko po 5 sek kończy działanie program

0

Dałem sobie rade.
Dałem

		
	while(!isDone){
	threads.forEach(arg -> System.out.print(arg.getName().substring(7)));
	try {
		Thread.sleep(1000);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	}
	
	}

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