我是多线程新手。目前我正在学习锁定并通知和同步块。我创建了一个小程序来检查如何等待和通知使用同步块,如果我不会创建任何线程(我认为主线程将获得锁定)。以下是更好理解的代码。
public class Problem1
{
public void waitForSignal() throws InterruptedException
{
Object obj=new Object();
synchronized (obj) {
obj.wait();
obj.notify();
}
}
public static void main(String args[]) throws InterruptedException
{
Problem1 pb=new Problem1();
pb.waitForSignal();
System.out.println("hello");//controll not come here
}
}
如果我运行上述程序,它会卡住。和控制都不会通知notify(),也不会退出同步块。为什么代码表现得像这样。 我试图在谷歌搜索,我发现以下声明
wait()告诉调用线程放弃监视器并转到 睡觉直到其他一些线程进入同一个监视器并调用 notify()。
我从上面的陈述中理解,为了正确执行我的程序,我必须创建另一个线程,它将进入同一个监视器并中断当前锁定保持线程的执行。如果我错了,请让我纠正。 请我纠正上面的代码,这样它就可以正常工作而不会被困住。
答案 0 :(得分:3)
当您致电Angle = [1 7 15];
for i = 1:length(Angle)
% do some calculations here %%
% % % cl_matrix(i,:) = A.data(:,7);
% Populate cl_matrix
cl_matrix(i,:) = randi(10,1,10)*Angle(i);
% Create a struct with dinamic filed names
cl_struct_same_length.(['cl_' num2str(Angle(i))])=cl_matrix(i,:)
cl_struct_different_length.(['cl_' num2str(Angle(i))])=randi(10,1,Angle(i))
end
% Use "fieldnames" to get the names of the dinamically generated struct's field
cl_fields=fieldnames(cl_struct_same_length)
% Loop through the struct's fileds to perform some calculation on the
% stored values
for i=1:length(cl_fields)
cl_means(i)=mean(cl_struct_same_length.(cl_fields{i}))
end
% Assign the value stored in a struct's field to a variable
row_2_of_cl_matrix=getfield(cl_struct_different_length,(['cl_' num2str(Angle(2))]))
时,其他一些线程必须获取wait
上的锁定并致电obj
或notify
以表示等待线程继续进行。最简单的理解方法是在Consumer / Producer问题的上下文中,Oracle有一个关于that的非常好的教程。
线程中断是完全不同的。它是请求被中断的线程检查其中断状态并终止处理。 Brian Goetz在properly handling InterruptedException的背景下有一篇很好的文章。