0

У меня есть цикл while в методе. В этом цикле while есть много блоков if. Если у меня есть 2 потока, обращающихся к одному в цикле одновременно, как остановить один уникальный блок if одновременно. Должен ли я импортировать какую-либо вещь?Строки 2-го потока, которые доступны одному из блоков в java

while (true){ 
    if (condition){ 
       if (statement 1){//} 
       else if (statement){//} //I want only one thread to access this block at a time 
       else if (statement2){//} 
       else{//} 
    } 

    else if condition1){ 
       if (statement 1){//} 
       else if (statement){//} //I want only one thread to access this block at a time 
       else if (statement2){//} 
       else{//} 
       } 
    } 

    else if (condition 2){ 
       if (statement 1){//} 
       else if (statement){//} //I want only one thread to access this block at a time 
       else if (statement2){//} 
       else{//} 
       } 
    } 

    else{ 
       if (statement 1){//} 
       else if (statement){//} //I want only one thread to access this block at a time 
       else if (statement2){//} 
       else{//} 
       } 
    } 
+0

Используйте [ 'synchronized' блок] (https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html) –

+0

Подсказка: так много каскадом, если/иначе, являются четким признаком плохой дизайн. Подумайте о том, чтобы изучить хорошую книгу, такую ​​как «Чистый код» Роберта Мартина, если вы заинтересованы в ударе по качеству своего кода! Я гарантирую вам: такая сложная условная логика, в сочетании с многопоточным ... взорвет ваш ум. Вы можете потратить часы, пытаясь исправить это, но получится ... не быть. Серьезно: ** сначала ** упростить свой код, а затем добавить многопоточную часть. Выполнение этого в обратном порядке означает, что вы будете тратить в 5, 10 раз больше времени, чем следовало бы. – GhostCat

+0

Действительно верно! спасибо, направляя меня! Я хочу получить от вас больше рекомендаций! большое спасибо! – eagle

ответ

0

Существует несколько способов достижения этого, но почему бы вам не попробовать синхронизированный блок?

while(true) { 
    if (statement){//} 
    else if (statement){ //I want only one thread to access this block at a time 
     synchronized(this) { 
     //your critical section here 
     } 
    } 
    else if (statement){//} 
    else{//} 
} 
+0

Я отредактировал мой вопрос, фактическая проблема в том, что – eagle

Смежные вопросы