У меня есть простой класс с двумя синхронизированными методами. Тот, который должен снять около sh, и тот, который должен положить около sh.
И тогда у меня есть другой основной класс с внутренним классом. И основной класс, и внутренний класс реализуют Runnable, где основной класс использует метод «изъятия», а внутренний класс - метод «депозита».
Когда это будет сделано, я создаю два потока для запуска (т. Е. Запуска) отдельных методов в отдельных классах "Runnable".
Класс с синхронизированными методами имеет следующие методы:
package test;
public class ThreadClass {
int amount = 10;
synchronized void withdraw(int amount) {
System.out.println("going to withdraw...");
if(this.amount < amount) {
System.out.println("Less balance..");
try {
wait();
}
catch(Exception e) {
e.printStackTrace();
}
}
this.amount+=amount;
System.out.println("withdrawal completed");
}
synchronized void deposit(int amount) {
System.out.println("going to deposit...");
this.amount+=amount;
System.out.println("deposit completed");
notify();
}
}
и класс, который отвечает за реализацию Runnable, а также за запуск примера приложения, выглядит следующим образом:
package test;
public class ThreadTest implements Runnable {
@Override
public void run() {
ThreadClass withDraw = new ThreadClass();
withDraw.withdraw(20);
}
class Threadtest2 implements Runnable{
@Override
public void run() {
ThreadClass t10 = new ThreadClass();
t10.deposit(60);
}
}
public static void main(String[] args) throws InterruptedException {
ThreadTest tester = new ThreadTest();
ThreadTest.Threadtest2 tester2 = tester.new Threadtest2();
Thread t1 = new Thread(tester);
t1.start();
Thread t2 = new Thread(tester2);
t2.start();
}
}
Поэтому, когда я запускаю эту программу, я ожидаю, что notify () -call в методе deposit должен уведомить методdraw () - так, чтобы последние строки также выполнялись, т.е.
this.amount+=amount;
System.out.println("withdrawal completed");
.. но приложение продолжало работать и никогда не доходило до этой строки вручную прекратить его. Разве это не правильный способ сделать это?