我正在尝试创建一个多线程程序,如果我注释掉运行的打印行,那么逻辑将改变并打印前三个作为获胜者。如果没有评论,那么这可以正常工作并正确打印他们的位置。
package beans;
import java.lang.Thread;
class xyz extends Thread
{
String a;
static int k=1;
xyz(String c)
{
a=c;
}
public void run()
{
int i;
for(i=0;i<15;i++)
{
System.out.println(a+" is running in "+i+"km");
if(k==1 && i==14)
{
System.out.println(a+" is the winner");
k++;
}
else if(k>1 && i==14)
{
System.out.println(a+" is in "+k+ "place");
k++;
}
}
}
}
public class abc {
public static void main(String[] args) {
xyz t1= new xyz("car");
t1.start();
xyz t2= new xyz("bike");
t2.start();
xyz t3= new xyz("cycle");
t3.start();
xyz t4= new xyz("walk");
t4.start();
xyz t5= new xyz("arjun");
t5.start();
}
}
答案 0 :(得分:4)
此程序不是线程安全的。首先,应该对静态变量的var adapter = new ChatListAdapter(this, (IMvxAndroidBindingContext)BindingContext);
_chatList = FindViewById<MvxListView>(Resource.Id.chat_list_view);
_chatList.Adapter = adapter;
操作进行同步,或者应该使用k++
。
当您的程序不是线程安全的时候,不确定行为是一种非常常见的情况。打印出来的东西会影响线程的执行方式,导致删除这些操作可能会影响程序的行为(绝对正常但不理想)。
你的计划还有一个竞争条件。检查获胜者条件也应同步。
您应该仔细分析线程使用共享AtomicInteger
变量的方式。