Я пытаюсь напечатать синхронизированный объект Integer (mInt) с использованием двух потоков до 10. Однако ни один из потоков не блокирует другой поток, генерирует исключение, вставленное ниже. Может кто-то указать мою ошибку здесь. Это скорее вопрос, связанный с Java, но включающий тег «android», потому что я закодировал его для Android, и мне нужно попробовать где-то в нем.Пытается печатать четные и нечетные числа из общего ресурса
09-24 15: 24: 17,198 10621-11400/com.sameer.android.samplecode Е/AndroidRuntime: неустранимый: резьба-364 процесс: com.sameer.android.samplecode, ПИД: 10621 java.lang.IllegalMonitorStateException: объект не заблокирован нитью перед уведомлением() на java.lang.Object.notify (собственный метод) на com.sameer.android.samplecode.MainActivity $ Even.run (MainActivity.java:55)
public class MainActivity extends AppCompatActivity {
private Integer mInt;
class Odd extends Thread {
private final String TAG = Odd.class.getSimpleName();
@Override
public void run() {
Log.i(TAG, "Odd() Started....");
synchronized (mInt) {
try {
while (mInt <= 10)
{
while (mInt % 2 != 1) {
Log.i(TAG, "Odd... Looping " + mInt);
mInt.wait();
}
mInt++;
Log.i(TAG, "Odd " + mInt);
mInt.notify();
}
}
catch (InterruptedException e) {
Log.e(TAG, "Odd() " + e.getMessage());
}
}
Log.i(TAG, "Odd() Ended....");
}
}
class Even extends Thread {
private final String TAG = Even.class.getSimpleName();
@Override
public void run() {
Log.i(TAG, "Even() Started....");
synchronized (mInt) {
try {
while (mInt <= 10)
{
while (mInt % 2 != 0) {
Log.i(TAG, "Even... Looping " + mInt);
mInt.wait();
}
mInt++;
Log.i(TAG, "Even " + mInt);
mInt.notify();
}
}
catch (InterruptedException e) {
Log.e(TAG, "Even() " + e.getMessage());
}
}
Log.i(TAG, "Even() Ended....");
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mInt = new Integer(0);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Even even = new Even();
even.start();
Odd odd = new Odd();
odd.start();
}
});
}
}
Эй, Матиас, вы первый пара имели отношение ко мне. Цените свой комментарий. – Sameer
Я чувствую, что вы также должны отредактировать второй параграф. Возможно, я обманываю других. – Sameer