Ⅰ JAVA程序中有a,b两个线程,当a调用wait方法进入等待状态后,b用notify方法
这个是不确定,双线程都有可能执行到。如果短期类线程执行完毕,有很大可能只执行其中的某一个线程,你可以把线程执行时间调长点就能看到结果了(如在线程中加上for 循环,循环时间长点)
Ⅱ java线程wait方法
wait和notify是用在多线程竞争同一锁资源的情况下使用的。
你这段代码实际是个单线程,这个线程自己把自己阻塞了,自然不可能自己把自己唤醒。
你的意图怎么实现呢?需要加入另外一个线程,下面是我仿照你的意图写的一段代码,供参考下
publicclassA
{
publicA(){
finalAa=this;
Threadth1=newThread(){
@Override
publicvoidrun(){
//一直循环,去尝试着唤醒a
try
{
this.sleep(10000);
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}//为检查是不是能真正实现唤醒a,等待10000毫秒,此时保证a已经处于等待状态中。
while(true){
/**
*用notify唤醒的线程必须是持有当前锁对象的线程
*/
synchronized(a){
a.notify();
}
}
}
};
th1.setDaemon(true);//这句也是必须的,将th1设为守护线程,保证在唤醒a以后,所有活动的线程都为守护线程,jvm能及时推出
th1.start();//和a.run的顺序不可以换
this.run();
}
publicstaticvoidmain(String[]args)
{
newA();
}
publicvoidrun()
{
/**
*这里可以换成这样,直接锁住this就行了
*/
synchronized(this)
{
try
{
this.wait();//阻塞当前的线程
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
System.out.println("1");//执行finally
}
}
}
}
Ⅲ java中怎样使用线程在调用一个函数后过几秒钟再调用另一个函数
应该有必要开启一个新的线程去监视isover线程是否结束,
一来 可以解决线程isover因为执行时间过长导致超时的问题
而来 也能通过监测isover线程的状态来实现线程结束再做其他处理的问题!
1、如果一个线程调用了某个对象的wait方法,那么该线程进入到该对象的等待池中(并且已经将锁释放),
如果未来的某一时刻,另外一个线程调用了相同对象的notify方法或者notifyAll方法,
那么该等待池中的线程就会被唤起,然后进入到对象的锁池里面去获得该对象的锁,
如果获得锁成功后,那么该线程就会沿着wait方法之后的路径继续执行。注意是沿着wait方法之后
2.如果没有直接性的调用同类里的其他接口,或者返回,结束等java关键字,代码还是得往下执行的。
Ⅳ 线程调用wait方法,再在别的线程调用notify方法的问题
java里面wait是使当前线程进入等待状态 并非是终止释放
当其他线程调用notify时 wait继续工作 当然这个也只是仅限制在同一监视器 呵呵!
但是这个具体要看你怎么写的 才能知道是不是从头执行 多线程时 可能 你这个wait等待时是10 别的线程执行一段时间以后 这个线程被notify时 可能从100开始执行 当然也可能不变 就是线程间互不通信
下次 最好能把你写的代码发上来 详细分析。
Ⅳ java执行了wait()方法,为什么还能够正常的运行run方法内的代码
你wait()挂起的是主线程,run()方法是在thread1线程内执行,两者不冲突。
Ⅵ 在Java中直接调用wait()方法时,请问是让哪个线程进入等待呢
main()所在的线程,这个线程包括一个Object对象,你需要在Object中启用notify()才可以重新唤醒
Ⅶ java 中1、一个线程调用了wait(),随后被notify()唤醒,这个线程会接着执行wait
1、如果一个线程调用了某个对象的wait方法,那么该线程进入到该对象的等待池中(并且已经将锁释放),
如果未来的某一时刻,另外一个线程调用了相同对象的notify方法或者notifyAll方法,
那么该等待池中的线程就会被唤起,然后进入到对象的锁池里面去获得该对象的锁,
如果获得锁成功后,那么该线程就会沿着wait方法之后的路径继续执行。注意是沿着wait方法之后
2.如果没有直接性的调用同类里的其他接口,或者返回,结束等java关键字,代码还是得往下执行的。
Ⅷ java多线程关于Thread实例对象执行wait方法的问题
wait()方法只是让当前线程(t1调用的,就是t1线程)在当前时间片不抢占cpu,但下一个时间片该抢还是抢
正常都是子线程执行完,主线程才继续执行,所以t1执行完,主线才会执行,而且是没有障碍地执行
最后你那个同步锁没什么用,因为没有线程跟主线程抢着执行同步块里的内容
Ⅸ 在synchronize代码块中调用wait后还会继续执行后续的代码吗
wait是让使用wait方法的对象等待,暂时先把对象锁给让出来,给其它持有该锁的对象用,其它对象用完后再告知(notify)等待的那个对象可以继续执行了,因此,只有在synchronized块中才有意义(否则,如果大家并不遵循同步机制,那还等谁呢?根本没人排队,也就谈不上等待和唤醒了)
以下是一个例子,用以展示这种机制:
publicclassThreadA{
publicstaticvoidmain(String[]args){
ThreadBb=newThreadB();
b.start();//主线程中启动另外一个线程
System.out.println("bisstart....");
//括号里的b是什么意思,应该很好理解吧
synchronized(b){
try{
System.out.println("Waitingforbtocomplete...");
b.wait();//这一句是什么意思,究竟谁等待?
System.out.println("ThreadBisCompleted.Nowbacktomainthread");
}catch(InterruptedExceptione){}
}
System.out.println("Totalis:"+b.total);
}
}
classThreadBextendsThread{
inttotal;
publicvoidrun(){
synchronized(this){
System.out.println("ThreadBisrunning..");
for(inti=0;i<=100;i++){
total+=i;
}
System.out.println("totalis"+total);
notify();
}
}
}
Ⅹ JAVA中,我在类中自己定义了一个方法,然后直接调用了wait()方法,请问是让哪个线程等待呢
主线程main()