vc/mfc
2009-02-07 16:30:26
阅读
109
评论
字号:
大
中
小
订阅
如果一个线程由于等待某些事件的发生而被阻塞,又该如何实现该线程的中断呢?比如当一个线程由于需要等候键盘输入而被阻塞,处于不可运行状态时,即使主程序中将该线程的共享变量设置为true,但该线程此时根本无法检查循环标志,当然也就无法立即中断。
其实,这种情况经常会发生,比如调用Thread.join()方法,或者Thread.sleep()方法,在网络中调用ServerSocket.accept()方法,或者调用了DatagramSocket.receive()方法时,都有可能导致线程阻塞。即便这样,仍然不要使用stop()方法,而是使用Thread提供的interrupt()方法,因为该方法虽然不会中断一个正在运行的线程,但是它可以使一个被阻塞的线程抛出一个中断异常,从而使线程提前结束阻塞状态,退出堵塞代码。
下面看一个例子来说明这个问题:
// 例4.4.3 InterruptThreadDemo3.java
class MyThread extends Thread
{
volatile boolean stop = false;
public void run()
{
while(!stop)
{
System.out.println(getName()+" is running");
try
{
sleep(1000);
}catch(InterruptedException e){
System.out.println("week up from blcok...");
stop=true; // 在异常处理代码中修改共享变量的状态
}
}
System.out.println(getName()+" is exiting...");
}
}
class InterruptThreadDemo3
{
public static void main(String[] args) throws InterruptedException
{
MyThread m1=new MyThread();
System.out.println("Starting thread...");
m1.start();
Thread.sleep(3000);
System.out.println("Interrupt thread...:"+m1.getName());
m1.stop=true; // 设置共享变量为true
m1.interrupt(); // 阻塞时退出阻塞状态
Thread.sleep(3000); // 主线程休眠3秒以便观察线程m1的中断情况
System.out.println("Stopping application...");
}
}
|
程序中如果线程m1发生了阻塞,那么虽然执行了m1.stop=true;语句,但是stop的值并未改变。为了能够中断该线程,必须在异常处理语句中对共享变量的值进行重新设置,从而实现了在任何情况下都能够中断线程的目的。
一定要记住,m1.interrupt();语句只有当线程发生阻塞时才有效。它的作用就是抛出一个InterruptedException类的异常对象,使try…catch语句捕获异常,并对其进行处理。请读者仔细研究这个程序,以便能够看出其中的巧妙之处。
如何结束阻塞状态的线程(会引起结束程序后进程还在)<br />vc/mfc2009-02-07 16:30:26阅读109评论0 字号:大中小 订阅<br />如果一个线程由于等待某些事件的发生而被阻塞,又该如何实现该线程的中断呢?比如当一个线程由于需要等候键盘输入而被阻塞,处于不可运行状态时,即使主程序中将该线程的共享变量设置为true,但该线程此时根本无法检查循环标志,当然也就无法立即中断。<br />其实,这种情况经常会发生,比如调用Thread.join()方法,或者Thread.slee
当程序中包含多个
线程
时,CPU 不是一直被特定的
线程
霸占,而是轮流执行各个
线程
。
那么,CPU 在轮换执行
线程
的过程中,即从创建到消亡的整个过程,可能会历经 5 种状态,分别是新建、就绪、运行、
阻塞
和死亡。
线程
的新建状态
无论是通过
Thread
类直接实例化对象创建
线程
,还是通过继承自
Thread
类的子类实例化创建
线程
,新创建的
线程
在调用 start() 方法之前,不会得到执行,此阶段的
线程
就处于新建状态。
线程
的就绪状态
当位于新建状态的
线程
调用 start() 方法后,该
线程
就转换到就绪状态。
所谓就绪,就是告诉 CPU,该
线程
已经可以执行了,但是具体什么时候执行,取决于 CPU
关闭由于server
Socket
监听
阻塞
住的
线程
,对于未
阻塞
的
线程
简单的设置一个变量stop,每次轮询检测stop的值即可,但是这对于被
阻塞
的
线程
是行不通的。由于被
阻塞
住,根本无法检测stop变量的值。
程序提供了closeClient()方法,在这个方法中,首先设置stop变量为true,然后与本server
Socket
建立链接,建立之后立即关闭。这样在run方法中的serverSocke...
而
MFC
的东西感觉比Java要难,关键是我手里没有合适的帮助文档。
所以就用了Swt ,有的大牛可以用swing写出很漂亮的程序,
我还是感觉就我这实力还是用swt做点好看的吧。
那么很快就会遇到一个问题,当我执行到
Socket
.accept()时,整个
BLOCKED(锁
阻塞
)
同步代码需要获取对应的锁对象,如果锁对象被其他
线程
持有,则当前
线程
就会进入一个block状态,当当前
线程
持有锁对象时,进入RUNNABLE状态
WAITING(无线等待)
通过一个wait方法
线程
进入一个无线等待状态,需要另一个
线程
进行唤醒操作
TIME_WAITING(计时等待)
当前进程会在一定时间后从等待
JAVA
线程
的状态
JAVA
线程
的状态
(首先说一下,我看网上有很多帖子说java
线程
有5种状态,实际上是不正确的。这里请各位客官不要把JAVA
线程
的状态和操作系统
线程
的状态弄混淆了,JAVA
线程
的状态在JAVA的官方文档上已经明确表明了,有6种)
JAVA官方文档:
A
thread
state. A
thread
can be in one of the following states:
A
thread
that has not yet started is in this state.
RUNNABLE
A
thread
executing in the Java
String
msg= do { i =
socket
.Receive(MyBuffer, MyBuffer.Length, 0); ss += Encoding.ASCII.Get
String
(MyBuffer); } while (
socket
.Available != 0);
转载于:https://www.cnblogs.com/btbear/p/3346166.html
程序A,绑定192.168.100.1(本机地址)的8000端口,向192.168.100.1(本机地址)的9000端口发消息。
程序B,绑定192.168.100.1的9000端口,向192.168.100.1的8000端口发消息。
A和B均开始运行,可以互相发送消息(多
线程
或者单
线程
),运行正常!符合预期!
A运行,但B不运行,则A在ReceiveFr
1.
socket
通信中服务器和客户端需要互相收发数据,而readLine()这个函数,如果接收到数据没有换行标志,就会一直堵塞在那
writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
socket
.getOutputStream())), true);
线程
处于
阻塞状态
通常有以下几种情况:
1. 等待
阻塞
:
线程
执行了wait()方法,会释放占用的锁并进入等待队列,直到其他
线程
调用notify()/notifyAll()方法唤醒该
线程
。
2. 同步
阻塞
:
线程
在获取对象的同步锁时,若该锁已被其他
线程
占用,则该
线程
进入同步
阻塞状态
,等待其他
线程
释放该锁。
3. 睡眠
阻塞
:
线程
执行了sleep()方法,会进入睡眠
阻塞状态
,等待一定时间后自动苏醒。
4. IO
阻塞
:
线程
执行了输入输出操作,若该操作未完成,则该
线程
进入IO
阻塞状态
,等待IO操作完成。
5. 锁池
阻塞
:
线程
试图进入同步块或方法时,发现同步块或方法被其他
线程
占用,则该
线程
进入锁池
阻塞状态
,等待其他
线程
释放锁。
处于
阻塞状态
的
线程
不能执行任何操作,直到
阻塞
条件解除。