⑴ 现在有一个动态改变的C#对象 obj,两个线程都需要访问这个对象。如何控制这两个线程排队访问
可以新建另外的一个类ControlObj,通过该类控制对obj的访问,
类ControlObj中有静态变量canDo(bool类型),当其中一个线程(线程A)访问obj后,canDo=false,另一个线程(线程B)访问时候循环等待,当线程A访问完后,canDo=true,这时线程B才能访问。
⑵ java 多线程 两个线程访问两个对象中不同的synchronized修饰的方法。(方法和对象都是同一个类的)
先上结论:两个线程访问不同对象中不同的synchronized方法不会受到synchronized的限制。
程序运行结果之所以这样,原因在于run()方法的实现导致的。
线程1中,先调用m.test1(),接着Thread.sleep(1000)
线程2中,先Thread.sleep(1000),接着调用m.test2()
主程序中,线程1与2都有可能先开始,无论谁先开始,结果都是线程1中m.test1()先结束,线程2中m.test2()后结束。
因为轮到线程2时,先Thread.sleep(1000),将资源让给线程1
改进方法,应该在打印时,让线程sleep
classTest{
synchronizedpublicvoidtest1(){
for(intp=0;p<5;p++){
try{
Thread.sleep(500);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
System.out.println("s1.run.TestSynchronized_test1");
}
}
synchronizedpublicvoidtest2(){
for(intp=0;p<5;p++){
try{
Thread.sleep(500);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
System.out.println("s2.run.TestSynchronized_test2");
}
}
}
run()方法中直接调用即可
classTestSynchronized_1implementsRunnable{
privateTestm;
publicTestSynchronized_1(Testm){
this.m=m;
}
publicvoidrun(){
m.test1();
}
}
classTestSynchronized_2implementsRunnable{
privateTestm;
publicTestSynchronized_2(Testm){
this.m=m;
}
publicvoidrun(){
m.test2();
}
}
输出结果如下:
s2.run.TestSynchronized_test 2
s2.run.TestSynchronized_test 2
s1.run.TestSynchronized_test 1
s1.run.TestSynchronized_test 1
s2.run.TestSynchronized_test 2
s1.run.TestSynchronized_test 1
s2.run.TestSynchronized_test 2
s1.run.TestSynchronized_test 1
s2.run.TestSynchronized_test 2
⑶ 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
不能,一个对象的一个synchronized方法只能由一个线程访问。对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的。
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。
同步的实现方面有两种,分别是synchronized,wait与notify。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
(3)线程访问对象扩展阅读
线程的特点:
1、线程是轻量级的进程;
2、线程没有独立的地址空间(内存空间);
3、线程是由进程创建的(寄生在进程);
4、一个进程可以拥有多个线程-->这就是我们常说的多线程编程;
5、线程有几种状态:
a、新建状态(new)
b、就绪状态(Runnable)
c、运行状态(Running)
d、阻塞状态(Blocked)
e、死亡状态(Dead)
多线程的好处:
1、充分利用CPU的资源;
2、简化编程模型;
3、带来良好的用户体验。
⑷ java中一个线程调用一个对象的一个同步方法,那么另一个线程能否同时访问此对象的另一个同步方法
不能。另一个线程可以访问此对象的其它异步方法,而此同步方法不可以访问!
概括地说:
一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的异步方法。
一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。
一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法。
⑸ java 怎么在一个线程对象访问某类的时候 追加一个任务在其执行完之后执行
java.util.concurrent.CountDownLatch 这个类可以实现你所要的功能
例如:CountDownLatch latch = new CountDownLatch(5) //声明计数器为5个
Thread t = new Thread() {
public void run() {
try {
//TODO 你的应用
} catch (Exception e) {
//TODO 异常处理
}
finally {
latch.countDown(); //这句是关键
System.out.println("ok"); //5个线程都跑完后输出
}
}
};
t.start();
然后让以上操作循环五次(就是说同时开5个线程),那么这个"ok"就会在等到这5个线程都ok后才会被输出一次。
⑹ C#如何在线程中访问控件对象
利用ListView.Invoke解决跨线程安全调用,关键代码如下:
voidFindFileInDir(){
if(listView2.InvokeRequired)
{
//跨线程调用
listView2.Invoke(newMethodInvoker(delegate
{
listView2.Items.Add(path);
}));
}
else
{
//直接调用
listView2.Items.Add(path);
}
}//EndofFindFileInDir
⑺ 当一个线程访问一个对象的方法时,另一个线程还能访问这个对象吗
可以啊,但是这样可能会改变你想要得到的结果,可以用信号量啦约束,使一个对象被一个线程访问的时候,另一个线程不能访问。
⑻ 怎么使用线程同时进行操作多个对象
局部变量不会受多线程影响
成员变量会受到多线程影响
多个线程应该是调用的同一个对象的同一个方法:
如果方法里无成员变量,那么不受任何影响
如果方法里有成员变量,只有读操作,不受影响