java阻塞
㈠ java如何实现方法的阻塞
你可以尝试研究下FutureTask类和Callable接口,他们是一种阻塞线程
举个例子:
ReceiveThread rt=new ReceiveThread();
FutureTask<String> task=new FutureTask<String>(rt);
Thread t=new Thread(task);
t.start();
String s=task.get();//阻塞方法,只有当Callable里的call方法运算结束,才会解除阻塞
class ReceiveThread implements Callable<String>{
public String call() throws Exception{
while(....){
........
.......
return String;
}
}
}
那你就写个线程不断监听result这个值不就行了,当监听到的是关闭的值就打印
㈡ java中如何使一个线程进入阻塞态
假设你有一个主线程,线程名为:Thread_A,然后通过Thread_A创建了线程Thread_B、Thread_C,并将线程Thread_B、Thread_C作为局部变量的方式存储在Thread_A中,并调用Thread_B、Thread_C的start()方法开始执行Thread_B、Thread_C,当Thread_A执行到你要停止的地方就分别调用Thread_B、Thread_C的Wait()方法,使Thread_B、Thread_C暂停,然后线程Thread_A继续执行,直到Thread_A中调用Thread_B、Thread_C的notify()方法使得Thread_B、Thread_C继续执行,大体上就是这样!
㈢ java怎么写阻塞式io流,阻塞与非阻塞在写法上的有什么区别求大神
首先要明白什么是“阻塞”?
阻塞实际是针对“当前”线程的一个概念,当前线程可以往下走,就是没有阻塞,否则就可以说当前线程被阻塞了。
明白了概念就好处理了:
非阻塞:new Thread(){ public void run(){ /* 我的IO处理*/ } }.start()
阻塞:aInputStream.read()这样就可以了。最简单的验证:在main方法中加入这句“System.in.read();”看看你的程序是不是停在这句了?除非你在控制台输入东西,否则你的程序就“阻塞”在这里了。
㈣ 为何会产生阻塞 java
估计是你之前哪里调用了类似server.accept之类的代码,然后就阻塞在那里了。
把代码放上来看看。
如果不用线程,主程序在处理一个服务器和客户端之间的通信时,没有处理完就不能去并行处理其他事情,而实际上网络间通信主程序大部分时间是等在那,浪费了系统资源和效率。
也就是说这个通信处理阻塞了主程序在等待的时候去并行处理其他事情。
㈤ Java中阻塞和等待的区别
定义解释
阻塞:当一个线程试图获取一个内部的对象锁(非java.util.concurrent库中的锁),而该锁被其他线程持有,则该线程进入阻塞状态。
等待:当一个线程等待另一个线程通知调度器一个条件时,该线程进入等待状态。例如调用:Object.wait()、Thread.join()以及等待Lock或Condition。
可以通过代码与JConsole来验证
验证阻塞
public static void main(String[] args) throws Exception {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
// 等待主线程获取锁
Thread.sleep(10000);
// 请求locker对象的内部锁
synchronized (locker) {
System.out.println("Get locker");
}
} catch (InterruptedException e) {
// TODO: handle exception
}
}
}, "Blocked Thread");
thread.start();
// 请求locker内部对象锁
synchronized (locker) {
// 始终持有locker对象的内部锁
while (true) {
;;
}
}
}
㈥ java中如何编程实现阻塞
自己写阻塞,就是写个死循环不断取参数,当参数条件满足时就调用相应的方法执行,
具体的执行方法可以交给一个线程来执行
㈦ java线程阻塞问题,怎么解决
典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。但suspend()方法很容易引起死锁问题,已经不推荐使用了。wait() 和 notify() 方法:两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用。 初看起来它们与 suspend() 和 resume() 方法对没有什么分别,但是事实上它们是截然不同的。区别的核心在于,前面叙述的所有方法,阻塞时都不会释放占用的锁(如果占用了的话),而这一对方法则相反。 上述的核心区别导致了一系列的细节上的区别。 首先,前面叙述的所有方法都隶属于 Thread 类,但是这一对却直接隶属于 Object 类,也就是说,所有对象都拥有这一对方法。初看起来这十分不可思议,但是实际上却是很自然的,因为这一对方法阻塞时要释放占用的锁,而锁是任何对象都具有的,调用任意对象的 wait() 方法导致线程阻塞,并且该对象上的锁被释放。而调用 任意对象的notify()方法则导致因调用该对象的 wait() 方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。 其次,前面叙述的所有方法都可在任何位置调用,但是这一对方法却必须在 synchronized 方法或块中调用,理由也很简单,只有在 synchronized 方法或块中当前线程才占有锁,才有锁可以释放。同样的道理,调用这一对方法的对象上的锁必须为当前线程所拥有,这样才有锁可以释放。因此,这一对方法调用必须放置在这样的 synchronized 方法或块中,该方法或块的上锁对象就是调用这一对方法的对象。若不满足这一条件,则程序虽然仍能编译,但在运行时会出现IllegalMonitorStateException 异常。 wait() 和 notify() 方法的上述特性决定了它们经常和synchronized 方法或块一起使用,将它们和操作系统的进程间通信机制作一个比较就会发现它们的相似性:synchronized方法或块提供了类似于操作系统原语的功能,它们的执行不会受到多线程机制的干扰,而这一对方法则相当于 block 和wakeup 原语(这一对方法均声明为 synchronized)。它们的结合使得我们可以实现操作系统上一系列精妙的进程间通信的算法(如信号量算法),并用于解决各种复杂的线程间通信问题。 关于 wait() 和 notify() 方法最后再说明两点: 第一:调用 notify() 方法导致解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。 第二:除了 notify(),还有一个方法 notifyAll() 也可起到类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。 谈到阻塞,就不能不谈一谈死锁,略一分析就能发现,suspend() 方法和不指定超时期限的 wait() 方法的调用都可能产生死锁。遗憾的是,Java 并不在语言级别上支持死锁的避免,我们在编程中必须小心地避免死锁。 以上我们对 Java 中实现线程阻塞的各种方法作了一番分析,我们重点分析了 wait() 和 notify() 方法,因为它们的功能最强大,使用也最灵活,但是这也导致了它们的效率较低,较容易出错。实际使用中我们应该灵活使用各种方法,以便更好地达到我们的目的。
㈧ java accept阻塞
这里的API在设计时就是阻塞的,一般这样用:
server=newServerSocket(8888);//新建服务端监听
..........................................
while(waitForNewConnet){//判断是否继续等待新连接
Sockettemp=server.accept();
newMyConnect(this,temp).start();//在新线程中完成连接的处理,以免阻塞服务器
writeProxyServerLog("已建立的连接。"+++i);
}
.................
publicMyConnectextendsThread{//处理各种连接
.............................
}
㈨ java如何跳出堵塞
话说只能等待超时,因为你这种连接你不知道它到底是网络延时的问题,还是真的等待,不过你可以把延时时间设置短点
㈩ 在JAVA中Scanner的阻塞是什么意思
就是等待用户响应啊,当程序运行到scanner这行代码的时候需要用户输入数据,回车确认输入,然后程序才会接着根据已有代码运行并处理用户输入的数据。易懂不?不懂再问。