导航:首页 > 编程语言 > java线程等待池

java线程等待池

发布时间:2022-09-05 17:22:46

java线程池

java常用的线程池有三种:
1.
newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads)创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。

参数:
nThreads - 池中的线程数
返回:
新创建的线程池
抛出:
IllegalArgumentException - 如果 nThreads <= 0

2.
newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor()创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。

返回:
新创建的单线程 Executor

3.
newCachedThreadPool
public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。

返回:
新创建的线程池

Ⅱ Java线程状态中BLOCKED和WAITING有什么区别

Java线程状态中BLOCKED和WAITING有什么区别
新建状态(New) 新创建了一个线程对象。
就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
运行状态(Running) 就绪状态的线程获取了CPU,执行程序代码。
阻塞状态(Blocked) 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把

Ⅲ java线程wait方法

  1. wait和notify是用在多线程竞争同一锁资源的情况下使用的。

  2. 你这段代码实际是个单线程,这个线程自己把自己阻塞了,自然不可能自己把自己唤醒。

  3. 你的意图怎么实现呢?需要加入另外一个线程,下面是我仿照你的意图写的一段代码,供参考下



  4. 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怎样将多个线程放入到一个对象等待池中

TaskQueue Extends Queue
{
object taskLock = null ;

Runnable Dequeue ()
{
synchronized (taskLock)
{
while (getCount () <= 0)
{
taskLock.Wait () ;
}
return super.dequeue () ;
}
}
void Enqueue (Runnable runObject)
{
synchronized (taskLock)
{
super.enqueue (runObject) ;
taskLock.NotifyAll () ;
}
}

}

Ⅳ java如何创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。求代码

packagetest;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
{
publicstaticvoidmain(String[]args){
=Executors.newFixedThreadPool(3);
for(inti=0;i<10;i++){
finalintindex=i;
fixedThreadPool.execute(newRunnable(){
publicvoidrun(){
try{
System.out.println(index);
Thread.sleep(2000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
});
}
}
}

因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()

Ⅵ java 中1、一个线程调用了wait(),随后被notify()唤醒,这个线程会接着执行wait

1、如果一个线程调用了某个对象的wait方法,那么该线程进入到该对象的等待池中(并且已经将锁释放),
如果未来的某一时刻,另外一个线程调用了相同对象的notify方法或者notifyAll方法,
那么该等待池中的线程就会被唤起,然后进入到对象的锁池里面去获得该对象的锁,
如果获得锁成功后,那么该线程就会沿着wait方法之后的路径继续执行。注意是沿着wait方法之后
2.如果没有直接性的调用同类里的其他接口,或者返回,结束等java关键字,代码还是得往下执行的。

Ⅶ 如何等待java线程池中所有任务完成

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test {

public static void main(String args[]) throws InterruptedException {
ExecutorService exe = Executors.newFixedThreadPool(50);
for (int i = 1; i <= 5; i++) {
exe.execute(new SubThread(i));
}
exe.shutdown();
while (true) {
if (exe.isTerminated()) {
System.out.println("结束了!");
break;
}
Thread.sleep(200);
}
}
}

Ⅷ 详谈Java几种线程池类型介绍及使用方法

线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程 排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程 池中有等待的工作线程,就可以开始运行了;否则进入等待队列。

Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。ThreadPoolExecutor是Executors类的底层实现。

Ⅸ java多线程相互等待

1、存在处以业务逻辑类,存在map,初始化。
2、存在线程池 最大200,ThreadFactory可以默认
3、单线程处理ip的类,构造方法包含是需参数Map,
4、外部循环 调用线程池,生成线程 传参 map 和当前循环次数
5、线程处理完ip后,将外部传来的循环次数做key,结果做value插入map,唤醒主线程判断map中的数量是否==需处理的ip的数量,选择跳出或继续等待。

Ⅹ java 如果wait中的线程竞争不到锁是否重新进入wait等待池还是锁等待池

wait中的线程是不会去竞争对象锁的。
据我所知,开始由于调用了对象的wait方法,线程处于该对象的等待池中,
而后,只有再去调用对象的notifyAll()(唤醒所有等待池中的线程)或者notify()(随机唤醒线程,姑且假设唤醒了我们的那个线程),线程会进入该对象的锁池之中。
锁池中的对象相互竞争对象锁,优先级高的线程竞争得到对象锁的概率高,假若线程没有竞争到,它还是会在锁池之中,唯有线程再次调用wait方法,它才会重新回到等待池中。

希望对你有帮助。

阅读全文

与java线程等待池相关的资料

热点内容
军营训练不听教官的命令 浏览:258
v开头的音乐播放器是什么APP 浏览:117
单片机是怎么做出来的 浏览:315
博图怎么作为opc服务器 浏览:100
编译做题软件 浏览:293
桥梁检测pdf 浏览:685
化解压力的一种方法 浏览:680
路由器和DSN服务器有什么区别 浏览:547
android伸缩控件 浏览:851
androidm3u8缓存 浏览:234
imphp开源知乎 浏览:706
清除网络通配符dos命令 浏览:837
鸿蒙系统怎么快速换回安卓 浏览:712
pdf绿色虚拟打印机 浏览:213
androidtab框架 浏览:147
java转php的时间戳 浏览:640
编译libstdc依赖 浏览:659
清算法人与原法人的区别 浏览:411
家庭装修下载什么app软件 浏览:576
美食博主用什么app拍视频 浏览:817