java多线程中关于使用notify()方法的几个疑问 5C

代码:

public class NotifyAndWaitTest2 implements Runnable {
    public int i = 0;
    public Object lock;
    public SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");

    public NotifyAndWaitTest2(Object o) {
        this.lock = o;
    }

    @Override
    public void run() {
        synchronized (lock) {
            System.out.println(Thread.currentThread().getName() + " enter the SYNCHRONIZED block --- "+ sdf.format(new Date()));
            try {
                while (i < 9) {
                    Thread.sleep(500);
                    lock.notify();
                    lock.wait();
                    System.out.println(Thread.currentThread().getName() + " say:" + i++ + " --- " + sdf.format(new Date()));
                }
                lock.notify();
                return;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Object lock = new Object();
        NotifyAndWaitTest2 test = new NotifyAndWaitTest2(lock);
        Thread t1 = new Thread(test,"Thread A");
        Thread t2 = new Thread(test,"Thread B");
        Thread t3 = new Thread(test,"Thread C");
        Thread t4 = new Thread(test,"Thread D");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

执行结果:

Thread A enter the SYNCHRONIZED block --- 10:47:07.242
Thread B enter the SYNCHRONIZED block --- 10:47:07.743
Thread C enter the SYNCHRONIZED block --- 10:47:08.243
Thread D enter the SYNCHRONIZED block --- 10:47:08.743
Thread C say:0 --- 10:47:09.243
Thread D say:1 --- 10:47:09.744
Thread C say:2 --- 10:47:10.244
Thread D say:3 --- 10:47:10.744
Thread C say:4 --- 10:47:11.245
Thread D say:5 --- 10:47:11.745
Thread C say:6 --- 10:47:12.246
Thread D say:7 --- 10:47:12.746
Thread C say:8 --- 10:47:13.247
Thread D say:9 --- 10:47:13.247
Thread B say:10 --- 10:47:13.247
Thread A say:11 --- 10:47:13.247

这段代码我在 jdk1.7 和 jdk1.8 中都执行过,结果是"相同的"

我主要有两个问题:(以我贴出的这个执行结果为例)

1、在线程A 和线程B 进入了同步代码块之后,并且线程B 调用了 wait() 方法,为什么接下来一定是另外两个线程进入同步代码块?而不是线程A 开始打印 say。是"让新的线程进入同步代码块"的优先级比"调用wait()方法的线程被唤醒"的优先级高吗?

2、为什么调用 notify() 方法只能唤醒最后一个调用了 wait() 方法的线程?就像上面这个执行结果,只有线程C 和线程D 互相唤醒对方,为什么不能唤醒其他的线程,比如线程A 和线程B?

我认为抢对象锁应该是不规律的、随机的,比如这样:

Thread A enter the SYNCHRONIZED block
Thread B enter the SYNCHRONIZED block
Thread A say:0
Thread C enter the SYNCHRONIZED block
Thread B say:1
Thread A say:2
Thread D enter the SYNCHRONIZED block
Thread B say:3
Thread C say:4

1个回答

理论上是随机的,哪个抢到cpu资源就执行哪个,线程初始化的时候会设置默认优先级为5,可以通过设置线程优先级让线程更有抢的cpu资源的优势,但是也只是相对随机的,代码实现的时候就当成随机,不要依赖这一点就行了,Thread类有三个静态变量可以设置线程执行优先级分别为高中低
Thread.MAX_PRIORITY;
Thread.MIN_PRIORITY;
Thread.NORM_PRIORITY;

mxmxz
PriestM 回复夜空中的程序猿: 哈哈哈你这么说我突然有点"醒悟"了 这个问题再放一段时间 看看有没有人能给出其他答案的
接近 2 年之前 回复
xiongzirui
夜空中的程序猿 回复PriestM: 这个跟线程调度的算法,操作系统的管理方式,还有线程优先级等很多因素都有关系,不用纠结,当随机的用就行了
接近 2 年之前 回复
mxmxz
PriestM 是啊,正是因为知道"理论上是随机的",所以我才最困惑,到底是什么原因导致,使用 notify() 方法的时候,只唤醒最后一个调用了 wait() 方法的线程,而不是随机的其他线程【当然,用 notifyAll() 方法唤醒时,可以看到随机线程抢到资源开始执行
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于多线程中wait()和notify()的疑问
关于多线程,资料上说当线程A使用wait()方法后释放对象锁,直到其他线程使用notify()进行唤醒操作,但是这里是JVM会在wait()对象锁的线程中随机选取一线程,这就有一个问题了,如果多个线程都在wait状态的话,我想指定唤醒某一个线程不可以么?只能JVM随机唤醒?或者全部唤醒?
java多线程 wait和notify方法
public class ProductTest { public static void main(String[] args) { Clerk clerk = new Clerk(); Producter producter = new Producter(clerk); Consumer consumer = new Consume...
Java多线程中wait 和 notify 方法理解
简单介绍 wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁);其他线程可以访问;wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池...
多线程中的wait()和notify()方法
wait()和notify()方法属于Object类中的方法,是用于对线程之间进行资源对象锁的通信,其必须在synchronized(Obj){...}语法块内 wait()就是说线程在获取对象锁后,主动释放对象锁,同时本线程进行休眠。直到有其它线程调用该对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行 notify()就是对对象锁的唤醒操作。但有一点需要注意的是notif
java中几个notify、wait使用实例
java中多线程编程notify、wait的使用
java 多线程中的 wait 和 notify
文章来源:http://www.itnose.net/detail/6251068.html 更多文章:http://www.itnose.net wait和notify是通过对对象进行锁,来实现同步和互斥。   wait和notify函数需要在一段的同步代码中,即在 synchronized的代码段中。 简单的示例代码。     static class TestThread {...
Java多线程中的wait/notify
关于对象锁:对象锁 - http://blog.csdn.net/yx0628/article/details/79086511 wait 方法在使用之前,必须先获得此对象的对象锁,所以必须在同步方法或者同步块中使用,执行 wait 方法后,当前线程释放该对象的锁。wait 返回之前,此线程需要和其他等待对象的线程竞争来获得锁,才能继续执行 wait 后的处理。 notify 方法也必须在同步
关于Java中的多线程的疑问?
前段时间做了几个小系统,SSH架构的,目前已经上线了,rn项目都比较简单,根本就没有涉及到多线程,并发和网络编程这块,rn目前打算学下基础的部分,把这两块搞扎实点,rn请问下,WEB程序中怎么体现出这两点呢?rn谢谢,新人,多见谅。
Java中多线程关于wait()和notify()方法的小错误备忘录
使用wait和notify方法之前,一定要确认当前线程持有锁
Java多线程wait和notify
开一个子线程来完成一个循环处理的工作,我在主线程中能灵活控制这个子线程的开始、暂停/继续、结束。
关于JAVA多线程的疑问
最近在看Thinking in JAVA。发现一个有意思的问题,在原书668页有一个关于内部类来实现多线程的代码例子。这个倒不难理解,但在最后的一个难道了我,它既没有继承Thread类,也没有实现Runnable接口,那他是如何实现多线程的呢?rn[code=java]rnrnclass ThreadMethod rn private int countdown = 5;rn private Thread t;rn private String name;rnrn public ThreadMethod(String name) rn this.name = name;rn rnrn public void runTask() rn if (t == null) rn t = new Thread(name) rn public void run() rn while (true) rn System.out.println(this);rn if (--countdown == 0) return;rn try rn sleep(10);rn catch (InterruptedException e) rn System.out.println("interrupted");rn rn rn rnrn public String toString() rn return getName() + ": " + countdown;rn rn ;rn t.start();rn rn rnrnrnpublic class ThreadVarationsrn public static void main(String[] args) rn for(int i=0;i<10;i++)rn new ThreadMethod("ThreadMethod").runTask();rn rnrnrn[/code]rnrn运行的结果显示,这个是以多线程的方式运行的,但是他是怎么创建多线程的呢?
Java中wait()与notify()方法的使用
wait()、notify()方法介绍1、wait()方法:让当前线程(持有锁的线程)处于等待(阻塞)的状态,并且释放它持有的锁。该线程将处于阻塞状态,直到其它线程调用notify()或者notifyAll()方法唤醒,线程进入就绪状态。2、wait(long):让当前线程(持有锁的线程)处于等待(阻塞)的状态,直到其它线程调用notify()或者notifyAll()方法或者超过指定的时间,线程...
Java中wait与notify方法的使用
在java多线程编程中,最被经常用到的便是wait与notfiy方法,这两个方法可以用来更加精确地控制被同步的代码,从而使得被同步的代码最小化,提高并发效率。 当某个类的某个方法被标记为synchronized时,这个方法在同一时间只能被一个线程访问。此时这个方法中的所有代码都是被同步的,只有当一个线程执行完所有的代码之后,下一个线程才能开始执行。当被同步的方法代码量比较小,而且每一...
关于java多线程的疑问
大家都知道,servlet是单例的,即web容器只对某个servlet创建一次,以后的请求如果请求的是该servlet,则所有请求共用一个servlet实例,于是我想测试一下,servlet在多线程下的表现。以下是个servlet类rnrnpublic class MServlet extends HttpServlet rn private static final long serialVersionUID = 1L;rn rn rn rn public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException rn System.out.println(request.getSession().getId()+","+Thread.currentThread().getId());rn rnrn rn public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException rn doGet(request,response);rn rnrnrnrnrn地址为http://localhost:8080/shiro-web/msrnrn我分别打开3个浏览器,敲入以上地址,可奇怪的是rn三次打印的thread id都是一样的,rn各位高人有谁懂为什么么rn另外,在什么情况下或者我怎么操作,才可以看到打印不同的thread id呢
初识java多线程的wait(), notify()方法
初识java多线程的wait(), notify()方法。
java 多线程中 synchronized 中的wait 方法 notify 理解
都说每个对象有一把锁。 一个线程 进入synchronized 代码块,就是给这个对象加了个锁。rn public synchronized void push (WoTou woTou) rn if(index==arr.length-1)rn try rn this.wait();rn catch (InterruptedException e) rn e.printStackTrace();rn rn rn this.notify();rn ++index;rn arr[index]=woTou;rn rn当有个线程wait 时, 就是执行到 this.wait(); 时。this.notify (),怎么还能执行?rn
java wait()方法和notify()方法的使用
1、说明 对象调用notify()方法后, 调用后虚拟机可选择任何一个调用了 该对象wait()的线程投入运行,选择顺序不由代码控制,由虚拟机实现。如果是notifyAll(),则唤醒所有等待的线程运行。 值得注意的是,对象调用notify()方法后,本线程还可以继续执行。 2、使用例子程序进行说明 package com.zte.ums.zenap.pm.analysis; i
多线程协作——wait、notify方法
wait()方法 1.Causes the current thread to wait until another thread invokes the java.lang.Object.notify() method or the java.lang.Object.notifyAll() method for this object. In other words, this method ...
java多线程,正确使用wait 和 notify
众所周知, wait 和 notify 是线程之间通信用的, 要通信, 就必须要要有锁. wait , 是对锁进行释放,并且将当线程暂停(sleep是暂停不释放锁); notify, 是唤醒wait中的线程. 为了更好的理解我们通过一道笔试题来加深印象: 设计2条线程, 主线程循环5次后子线程循环8次,然后主线程继续循环5次子循环8次......., 一共循环10次.代码实现   首先分...
关于java多线程wait()和notify()的问题
这是一个关于线程加锁和解锁的小程序,理想的输出结果是rnkitty is runningrnkitty is runningrnkitty is runningrnkitty is runningrndoggy is runningrndoggy is runningrndoggy is runningrndoggy is runningrn但执行结果是无输出信息,在debug模式下看到的是整个程序都在wait状态,而不是对象dog1在wait状态,求大神解释~~rn[code=java]rnpublic class th4_1rn rn public static void main(String[] args) throws InterruptedException rn cccc dog=new cccc("doggy");rn cccc cat=new cccc("kitty");rn Thread dog1 = new Thread(dog); rn Thread cat1 = new Thread(cat); rn rn synchronized(dog1)rn try rn dog1.wait();rn catch (InterruptedException e) rn // TODO Auto-generated catch blockrn e.printStackTrace();rn rn cat1.start();rn dog1.start();rn dog1.notify();rn rn rnrnpublic class cccc implements Runnablern private String id;rn public cccc(String str)rn id=str;rn rn public void run()rn for (int i = 0; i < 4; i++) rn try rn Thread.sleep((int)(1000*Math.random()));rn rn catch (InterruptedException e) rn // TODO: handle exceptionrn rn System.out.println(id+" is running");rn rn rn rnrn rnrn[/code]
Java多线程 - Thread类中的几个方法
1.实例变量与线程安全 自定义线程类中的实例变量针对其他线程有共享与不共享之分,这在多个线程之间交互时是一个很重要的技术点。 不共享数据的情况:每个线程都有各自的实例变量,多个线程交互时不影响各自的实例变量值,不存在线程安全问题。 共享数据的情况:多个线程访问同一个实例变量,多个线程交互时存在“非线程安全问题”。 “非线程安全”是指多个线程对同一个对象中的实例变量进行操作时值被更改、值不同步
java多线程中几个常用的方法
1. currentThread Thread.currentThread()可以获取当前线程的引用,一般都是在没有线程对象又需要获得线程信息时通过Thread.currentThread()获取当前代码段所在线程的引用。 2. isAlive Thread.isAlive()返回true是不是表示这个线程的run()方法还在运行. 3.sleep sleep()方法导致了程序暂停执行指
关于Static控件的Notify的疑问
void CDVSDlg::OnMouseMove(UINT nFlags, CPoint point) rnrnCRect rc;rnrnGetDlgItem(IDC_STATICAA)-> GetWindowRect(&rc);//Static控件IDrnScreenToClient(&rc);rnif(PtInRect(&rc, point))rnrnMessageBox("test"); //把Notify属性勾上时,此句执行不到rnrnrn当把Notify去掉时,继承于CStatic的类的左键按下消息又响应不了,rn什么原因?rn有没有什么办法让两者都实现?
关于wait和notify的一些疑问
1、notify与notifyAll的具体区别是啥?notify是随机选择一个线程来唤醒它,其他的还是处于WAITING状态,notifyAll()唤醒所有等待该对象监视锁的线程,让它们去竞争该对象的锁。对于这两种方式,最终都是一个线程获得监视锁,但是具体实现上有什么不同呢?有什么情况是用notify优于使用notifyAll的?rnrn2、所谓的spurious wakeup是指什么?有没有例子说明一下?rnrn3、这点是关于一个由于调用对象的wait方法进入WAITING状态的线程,最后被唤醒又再可以被CPU调度时(不管是因为什么变为可以被CPU调度的)所发生的事:这个线程被从wait set中移除,又去和其他线程抢夺监视锁,获得锁后恢复现场(不知道这里说恢复现场对不对?)我想知道所谓获得锁是什么意思?就是获得了一块内存吗?rnrn4、wait函数是什么时候返回的?是调用wait后马上返回还是再这个线程再次获得监视锁后返回,然后又对while的条件进行检测(我觉得是后者)rnrn5、notify和notifyAll也会释放锁吧?会不会有那种场景:那个调用notify(或notifyAll)后,紧接着这个语句后面还执行其他语句?比如:notify(); other_statement;
Java中关于输入的几个疑问?
1、如何输入两个float或double类型的数?rn2、System.in.read(参数)中的参数怎么用?rn3、连续输入多个数是不是要去掉输入时候的回车符,有没有什么好办法?rnrn我现在看到输入就头疼,有没有明白人给我指点迷津?多谢!!
java多线程 中wait notify验证代码
package ThreadTest; /** * Created by Administrator on 2016/11/2. */ public class Service { public void testMethod(Object lock){ try{ synchronized(lock){ Syste
wait()和notify()方法使用
  1.wait()和notify()方法必须一起使用。 2.wait()和notify()必须在synchronized()代码块中。 3.调用wait()和notify()方法的对象必须和所对象一致。...
关于缓存使用的几个疑问
因为之前做的都是普通的企业级应用,访问量不大,没用过缓存。有几个疑问。rn1,不经常发生变化的数据才适合缓存吧。rn2,缓存更新是不是发生在取数据时检查是否有缓存,没有就读数据库,然后放入缓存以及更新数据时同时更新缓存,如果此时缓存已经过期,是自己放入缓存还是不管,等下次取数据时才更新缓存?rn3,比较经典的比如帖子回复,这种适合缓存吗?rn4,像企业级应用,一个用户一般也就读属于自己的数据,而且基本读一次就不会再读了,这样的没有缓存的必要吧?缓存应该是多次访问的才适合用吧?
关于java嵌入式的几个疑问
请路过的大虾给菜鸟解疑了。。rn在嵌入式方面是java用的多还是c/c++要多?rnjava嵌入式除了j2me还有哪些方向?rnjava嵌入式的前景看好吗?rn干java嵌入式除了j2se还要学那些东西,软件方面的?rn请给初学者点入门建议?rn谢谢大虾们,一下问了这么多。。。。。。。。。。
初学者关于JAVA的几个疑问
我以前用过delphi和C++ builder,感觉这种开发工具很容易入手的,rn现在因工作需要想学学JAVA,可是关于JAVA的东西种类繁多,复杂,我都搞晕了,rnrn请问各位大侠java,jsp,jbuilder这几个东西的区别呀。rnrn到底哪个才是正宗的JAVA,它们之间是什么关系,有什么联系。我想jbuilder应该和c++ builder类rn似;象DELPHI,C++ Builder等都有一个明显的开发环境,JSP的开发环境是什么呀?不会就是在页面的HTML里写吧?如果JSP就是在html里添加代码,那象edit等控件怎么添加到页面上呀?rnrn我是菜鸟,提这样的问题大家别笑话呀。rnrnrnrnrn
JAVA多线程——notify()和notifyAll()的注意事项
1. - waiting on —— 对应java.lang.Thread.State: WAITING 表示线程执行到了锁的wait()方法上 由于wait()方法会释放锁,所以当前线程此时处于未获取锁状态,等待notify() || notifyAll() 2. - waiting to lock —— 对应java.lang.Thread.State: BLOCKED 表示锁已经
一个死锁的简单例子
package com.rihui.thread; public class TestDeadLock1 { public static void main(String[] args) { //定义两把钥匙 final Object O1=new Object(); final Object O2=new Object(); new Thread(new Runnable()
JAVA——多线程间通信(wait 和notify)
从语法角度来说: Obj.wait(),Obj.notify必须在synchronized(Obj){…}语句块内。 从功能上来说: wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行。 notify()就是对对象锁的唤醒操作。 注意 (1)notify()调用后,并不是马上就释放对象
Java多线程——线程间的通信,wait() 与 notify()
1、概述 针对同一个资源的操作有不同的线程 2、例如: 通过设置线程和获取线程,针对同一个对象进行操作 3、线程的状态转换
java 多线程读写文件,wait,notify
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FileUtil {     FileInputStream fis;     byte[] bu...
java多线程的wait()和notify问题
问个问题,我通过synchronized(syncqURL) 控制一些线程的同步,其中syncqURL是个object对象rnrn[code=Java]rnsynchronized(syncqURL)rn rn et=s_qURL.poll();rn if(et==null)rn rn System.out.println(thread.getId()+"is on requiring URL failed");rn thread.SetIdle();rn if(DownloadThread.AskForIdle())rn rn DownloadThread.InterruptAll();rn rn elsern rn syncqURL.wait();rn continue;rn rn rn rn[/code]rnrn这里面有线程被挂起,那么如果我在某处有线程进入rnrn[code=Java]rnsynchronized(syncqURL)rn rn s_qURL.add(et);rn DownloadThread.NotifyAll();rn syncqURL.notifyAll();rn rn[/code]rnrnrn之前被挂起的线程的执行顺序是wait()语句后,还是重新进入run函数???rn
关于DataGrid在多线程中使用的疑问
在WinForm中定义了一个DataGrid,绑定了一个DataTable,并建立了一个线程用于采集数据,线程逻辑如下:rnpublic void thread_Listen()rnrn int iTmp;rn int iItemNum;rn DataRow myDataRow;rn byte[] recData;rn string strRecv;rn //通过UDP获取数据rn this.udp_client = new UdpClient ( this.iListenPort ) ;rn IPAddress a = IPAddress.Parse ( "127001" );rn receivePoint = new IPEndPoint ( a , this.iListenPort ) ;rn System.Text.ASCIIEncoding encode = new System.Text.ASCIIEncoding ( ) ;rnrn while (this.b_trace_continue == true)rn rn //将UDP获取的数据解析到字符串数组中rn recData = udp_client.Receive ( ref receivePoint ) ;rn strRecv = encode.GetString ( recData ) ;rn this.M_StatusBar.Text = strRecv;rn string[] strItemArray=strRecv.Split('|');rn iItemNum = strItemArray.Length;rn this.M_StatusBar.Text=strRecv;rn rn myDataRow = this.M_datatable.NewRow();rn for (iTmp = 1;iTmp < iItemNum-1; iTmp++)rn rn myDataRow[iTmp-1] = strItemArray[iTmp];rn rn this.M_datatable.Rows.Add(myDataRow);rn rnrn发现了一个奇怪的现象,程序接收到数据后DataGrid也将数据成功的显示出来,但是程序也就没有响应了,而此时打开任务管理器显示CPU,内存的占用率都很正常,如果注释掉this.M_datatable.Rows.Add(myDataRow);这一行,则不会发生没有响应的现象。为了测试这一问题,增加了下面一个方法,通过菜单点击事件执行则一切正常:rnprivate void menuItem8_Click(object sender, System.EventArgs e)rnrn int iTmp;rn DataRow myDataRow;rnrn for (iTmp = 0; iTmp < 10 ; iTmp ++)rn rn myDataRow = this.M_datatable.NewRow();rn myDataRow[0] = "aaaaa";rn myDataRow[1] = "bbbbb";rn myDataRow[2] = "ccccc";rn myDataRow[3] = "ddddd";rn myDataRow[4] = "eeeee";rn myDataRow[5] = "fffff";rn this.M_datatable.Rows.Add(myDataRow);rn rn rnrn不解!难道DataGrid不支持多线程应用?还望高人指点。
关于多线程在网络编程中的使用疑问!
基于TCP,一个客户端往100个服务器发送同一个文件。rn采用多线程的方法去实现。rn但有个疑问,之前对于这个问题问过坛子上的朋友们。rn就是多线程的实现:轮流时间片一会儿发给这线程个,一会儿发给另一个线程。rn那这样会不会造成全局变量的混乱啊!rn我的意思是:rn如果我定义了一个全局变量int n,在线程中使用。rn当n为10的时候,是在线程1中使用的。rn那按照那个朋友的说法,如果突然变成了线程2,那我这个n是不是从初始化开始,还是继续从10开始呢?rn下面我自己写的多线程可以保证每个线程都是独立的互相不干涉的呢?rn谁先谁后无所谓,关键是会不会互相影响?rn如果会,有什么办法解决他呢?rnrn对于多线程是第一次使用,请朋友帮我一下,谢谢。rn[code=C/C++]void CClientDlg::OnBnClickedBcStart()rnrn UpdateData();rnrn //启动线程rn for (int i = 0; i < m_iServerIndex; i++) //m_iServerIndex = 100rn rn HANDLE Client_Thread = NULL;rn unsigned Client_ThreadID = 0;rn Client_Thread = (HANDLE)_beginthreadex(NULL, 0, ClientThread, this, 0, &Client_ThreadID);rn if ( NULL == Client_Thread )rn return;rn rnrnrnunsigned __stdcall CClientDlg::ClientThread( void * obj )rnrn CClientDlg * pDlg = (CClientDlg*)obj;rn if ( NULL == pDlg )rn return -1;rnrn pDlg->LinkSend();//这里就负责创建每个socket,连接服务器,发送文件等rnrn return 0;rn[/code]rnrn
java 多线程notify wait 注意事项
1. 你可以使用wait和notify函数来实现线程间通信。你可以用它们来实现多线程(>3)之间的通信。 2. 永远在synchronized的函数或对象里使用wait、notify和notifyAll,不然Java虚拟机会生成 IllegalMonitorStateException。 3. 永远在while循环里而不是if语句下使用wait。这样,循环会在线程睡眠前后都检查wait的条件,
关于多线程WaitForMultipleObjects函数的几个疑问.
我生成一个管理线程,然后创建多个子线程使其执行,并在管理线程中用WaitForMultipleObjects循环等待所有子线程结束,参数1为所有子线程的句柄数组,但WaitForMultipleObjects函数返回的全部是WAIT_FAILED值,一直退不出循环,这是怎么回事?代码如下rnrnvarrn RoomCount:integer;rn RoomPos:integer;rn RoomAry:TRoomAry;rnrnrnprocedure TCodeManageThread.Execute;//管理线程rnvarrn i:integer;rn tmpList:TList;rn tmpMax:integer;rn tmpThreadHandle:array of THandle;//线程句柄数组rn tmpEvent:array of THandle;//线程开始事件rn R:DWORD;rnbeginrn inherited;rn tryrn FreeOnTerminate:=False;rn FThreadList:=TThreadList.Create;rn SetLength(tmpThreadHandle,8);rn SetLength(tmpEvent,8);rn tryrn tmpList:=FThreadList.LockList;rn tryrn Screen.Cursor := crAppStart;rn rn for i :=0 to 7 dorn beginrn tmpEvent[i]:=CreateEvent(nil,True,True,Pchar(IntToStr(i)));rn tmpList.Add(TCodeThread.Create(False,@tmpEvent[i]));rn tmpThreadHandle[i]:=TCodeThread(tmpList[i]).Handle;rn end;rn finallyrn FThreadList.UnlockList;rn end;rn exceptrn OutputDebugString('键码退出事件数组出错');rn Exit;rn end;rn RoomCount:=0;rn RoomPos:=0;rn tmpMax:=High(RoomAry);rn repeatrn for i :=0 to 7 dorn if RoomPos>tmpMax thenrn breakrn elsern if WaitForSingleObject(tmpEvent[i],100)=WAIT_OBJECT_0 thenrn tryrn if RoomPos>tmpMax thenrn beginrn TCodeThread(tmpList[i]).FQuited:=True;rn continue;rn end;rn EnterCriticalSection(FCritic);rn TCodeThread(tmpList[i]).FPos:=RoomPos;rn InterLockedIncrement(RoomPos);rn TCodeThread(tmpList[i]).FIp:=RoomAry[TCodeThread(tmpList[i]).FPos].ip;rn TCodeThread(tmpList[i]).FCodeList:=RoomAry[TCodeThread(tmpList[i]).FPos].CodeList;rn ResetEvent(tmpEvent[i]);//给子线程发信号rn LeaveCriticalSection(fCritic);rn finallyrn Application.ProcessMessages;rn end;rn R:=WaitForMultipleObjects(FMax,Pointer(@tmpThreadHandle[0]^),True,0);rn case R ofrn WAIT_OBJECT_0:OutputDebugString('object');rn WAIT_FAILED:OutputDebugString('failed');rn WAIT_TIMEOUT:OutputDebugString('timeout');rn end;rn until R<>WAIT_TIMEOUT;//这里返回值全是WAIT_FAILEDrn finallyrn for i :=0 to FMax-1 dorn TCodeThread(tmpList[i]).Free;rn tmpThreadHandle:=nil;rn tmpEvent:=nil;rn Screen.Cursor:=crDefault;rn OutputDebugString('所有线程已退出');rnrnprocedure TCodeThread.Execute;//子线程rnbeginrn inherited;rn tryrn FreeOnTerminate:=False;rn repeatrn if WaitForSingleObject(FEvent^,0)<>WAIT_OBJECT_0 then//FEVENT为管理线程的事件句柄指针rn beginrn SendCodes;rn InterLockedIncrement(RoomCount);;rn OutputDebugString(Pchar(s));rn if RoomCount>High(RoomAry) then rn FQuited:=True;rn SetEvent(FEvent^);rn end;rn until FQuited=True;rn finallyrn end;rnend;rnrn
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数