您当前所在位置: > 网游 > 综合热点

关于Java线程池,读完这一篇文章就够了

时间:2018-08-22 22:27:38  来源:  作者:网络
请注意:本文为编辑制作专题转载的资讯,页面显示的时间仅为生成静态页面时间而非具体内容事件发生的时间,由此给您带来的不便敬请谅解!

一、简介

线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的。在jdk1.5之后这一情况有了很大的改观。Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用。为我们在开发中处理线程的问题提供了非常大的帮助。二、线程池

线程池的作用:

线程池作用就是限制系统中执行线程的数量。

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

为什么要用线程池:

1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

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

比较重要的几个类:

要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

1. newSingleThreadExecutor

创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

2.newFixedThreadPool

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

3. newCachedThreadPool

创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

4.newScheduledThreadPool

创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

实例

1.newSingleThreadExecutor

MyThread.java

public class MyThread extends Thread {

@Override

public void run() {

System.out.println(Thread.currentThread().getName() + "正在执行。。。");

}

}

TestSingleThreadExecutor.java

public class TestSingleThreadExecutor {

public static void main(String[] args) {

//创建一个可重用固定线程数的线程池

ExecutorService pool = Executors. newSingleThreadExecutor();

//创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口

Thread t1 = new MyThread();

Thread t2 = new MyThread();

Thread t3 = new MyThread();

Thread t4 = new MyThread();

Thread t5 = new MyThread();

//将线程放入池中进行执行

pool.execute(t1);

pool.execute(t2);

pool.execute(t3);

pool.execute(t4);

pool.execute(t5);

//关闭线程池

pool.shutdown();

}

}

输出结果

pool-1-thread-1正在执行。。。

pool-1-thread-1正在执行。。。

pool-1-thread-1正在执行。。。

pool-1-thread-1正在执行。。。

pool-1-thread-1正在执行。。。

2.newFixedThreadPool

TestFixedThreadPool.Java

public class TestFixedThreadPool {

public static void main(String[] args) {

//创建一个可重用固定线程数的线程池

ExecutorService pool = Executors.newFixedThreadPool(2);

//创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口

Thread t1 = new MyThread();

Thread t2 = new MyThread();

Thread t3 = new MyThread();

Thread t4 = new MyThread();

Thread t5 = new MyThread();

//将线程放入池中进行执行

pool.execute(t1);

pool.execute(t2);

pool.execute(t3);

pool.execute(t4);

pool.execute(t5);

//关闭线程池

pool.shutdown();

}

}

输出结果

pool-1-thread-1正在执行。。。

pool-1-thread-2正在执行。。。

pool-1-thread-1正在执行。。。

pool-1-thread-2正在执行。。。

pool-1-thread-1正在执行。。。

3.newCachedThreadPool

TestCachedThreadPool.java

public class TestCachedThreadPool {

public static void main(String[] args) {

//创建一个可缓存的线程池

ExecutorService pool = Executors.newCachedThreadPool();

//创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口

Thread t1 = new MyThread();

Thread t2 = new MyThread();

Thread t3 = new MyThread();

Thread t4 = new MyThread();

Thread t5 = new MyThread();

//将线程放入池中进行执行

pool.execute(t1);

pool.execute(t2);

pool.execute(t3);

pool.execute(t4);

pool.execute(t5);

//关闭线程池

pool.shutdown();

}

}

输出结果:

pool-1-thread-2正在执行。。。

pool-1-thread-4正在执行。。。

pool-1-thread-3正在执行。。。

pool-1-thread-1正在执行。。。

pool-1-thread-5正在执行。。。

4.newScheduledThreadPool

TestScheduledThreadPoolExecutor.java

public class TestScheduledThreadPoolExecutor {

public static void main(String[] args) {

ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);

//每隔一段时间就打印================

exec.scheduleAtFixedRate(new Runnable() {

@Override

public void run() {

//throw new RuntimeException();

System.out.println("================");

}

}, 1000, 5000, TimeUnit.MILLISECONDS);

//每隔一段时间打印系统时间,证明两者是互不影响的

exec.scheduleAtFixedRate(new Runnable() {

@Override

public void run() {

System.out.println(System.nanoTime());

}

}, 1000, 2000, TimeUnit.MILLISECONDS);

}

}

输出结果

================

1189234402065640

1189236402741780

1189238399791546

================

1189240401041921

1189242399666218

================

1189244399158027

1189246399843486

1189248402084279

================三、ThreadPoolExecutor详解

ThreadPoolExecutor的完整构造方法的签名是:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue

workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) .

corePoolSize - 池中所保存的线程数,包括空闲线程。

maximumPoolSize-池中允许的最大线程数。

keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。

unit - keepAliveTime 参数的时间单位。

workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。

threadFactory - 执行程序创建新线程时使用的工厂。

handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。

ThreadPoolExecutor是Executors类的底层实现。

在JDK帮助文档中,有如此一段话:“强烈建议程序员使用较为方便的Executors工厂方法Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、Executors.newFixedThreadPool(int)(固定大小线程池)Executors.newSingleThreadExecutor()(单个后台线程),它们均为大多数使用场景预定义了设置。”

下面介绍一下几个类的源码:

ExecutorService newFixedThreadPool (int nThreads):固定大小线程池。

可以看到,corePoolSize和maximumPoolSize的大小是一样的(实际上,后面会介绍,如果使用无界queue的话maximumPoolSize参数是没有意义的),keepAliveTime和unit的设值表名什么?-就是该实现不想keep alive!最后的BlockingQueue选择了LinkedBlockingQueue,该queue有一个特点,它是无界的。

public static ExecutorService newFixedThreadPool(int nThreads) {

return new ThreadPoolExecutor(nThreads, nThreads,

0L, TimeUnit.MILLISECONDS,

new LinkedBlockingQueue

());

}

ExecutorService newSingleThreadExecutor():单线程

public static ExecutorService newSingleThreadExecutor() {

return new FinalizableDelegatedExecutorService

(new ThreadPoolExecutor(1, 1,

0L, TimeUnit.MILLISECONDS,

new LinkedBlockingQueue

()));

}

ExecutorService newCachedThreadPool():无界线程池,可以进行自动线程回收

这个实现就有意思了。首先是无界的线程池,所以我们可以发现maximumPoolSize为big big。其次BlockingQueue的选择上使用SynchronousQueue。可能对于该BlockingQueue有些陌生,简单说:该QUEUE中,每个插入操作必须等待另一个线程的对应移除操作。

public static ExecutorService newCachedThreadPool() {

return new ThreadPoolExecutor(0, Integer.MAX_VALUE,

60L, TimeUnit.SECONDS,

new SynchronousQueue

());

}

先从BlockingQueue

workQueue这个入参开始说起。在JDK中,其实已经说得很清楚了,一共有三种类型的queue。

所有BlockingQueue 都可用于传输和保持提交的任务。可以使用此队列与池大小进行交互:

如果运行的线程少于 corePoolSize,则 Executor始终首选添加新的线程,而不进行排队。(如果当前运行的线程小于corePoolSize,则任务根本不会存放,添加到queue中,而是直接抄家伙(thread)开始运行)

如果运行的线程等于或多于 corePoolSize,则 Executor始终首选将请求加入队列,而不添加新的线程。

如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。

queue上的三种类型

排队有三种通用策略:

直接提交。工作队列的默认选项是 SynchronousQueue,它将任务直接提交给线程而不保持它们。在此,如果不存在可用于立即运行任务的线程,则试图把任务加入队列将失败,因此会构造一个新的线程。此策略可以避免在处理可能具有内部依赖性的请求集时出现锁。直接提交通常要求无界maximumPoolSizes 以避免拒绝新提交的任务。当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。

无界队列。使用无界队列(例如,不具有预定义容量的 LinkedBlockingQueue)将导致在所有 corePoolSize 线程都忙时新任务在队列中等待。这样,创建的线程就不会超过 corePoolSize。(因此,maximumPoolSize的值也就无效了。)当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列;例如,在 Web页服务器中。这种排队可用于处理瞬态突发请求,当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。

有界队列。当使用有限的 maximumPoolSizes时,有界队列(如 ArrayBlockingQueue)有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。

BlockingQueue的选择

例子一:使用直接提交策略,也即SynchronousQueue。

首先SynchronousQueue是无界的,也就是说他存数任务的能力是没有限制的,但是由于该Queue本身的特性,在某次添加元素后必须等待其他线程取走后才能继续添加。在这里不是核心线程便是新创建的线程,但是我们试想一样下,下面的场景。

我们使用一下参数构造ThreadPoolExecutor:

new ThreadPoolExecutor(

2, 3, 30, TimeUnit.SECONDS,

new SynchronousQueue

(),

new RecorderThreadFactory("CookieRecorderPool"),

new ThreadPoolExecutor.CallerRunsPolicy());

当核心线程已经有2个正在运行.

此时继续来了一个任务(A),根据前面介绍的“如果运行的线程等于或多于 corePoolSize,则 Executor始终首选将请求加入队列,而不添加新的线程”,所以A被添加到queue中。

又来了一个任务(B),且核心2个线程还没有忙完,OK,接下来首先尝试1中描述,但是由于使用的SynchronousQueue,所以一定无法加入进去。

此时便满足了上面提到的“如果无法将请求加入队列,则创建新的线程,除非创建此线程超出maximumPoolSize,在这种情况下,任务将被拒绝。”,所以必然会新建一个线程来运行这个任务。

暂时还可以,但是如果这三个任务都还没完成,连续来了两个任务,第一个添加入queue中,后一个呢?queue中无法插入,而线程数达到了maximumPoolSize,所以只好执行异常策略了。

所以在使用SynchronousQueue通常要求maximumPoolSize是无界的,这样就可以避免上述情况发生(如果希望限制就直接使用有界队列)。对于使用SynchronousQueue的作用jdk中写的很清楚:此策略可以避免在处理可能具有内部依赖性的请求集时出现锁。

什么意思?如果你的任务A1,A2有内部关联,A1需要先运行,那么先提交A1,再提交A2,当使用SynchronousQueue我们可以保证,A1必定先被执行,在A1么有被执行前,A2不可能添加入queue中。

例子二:使用无界队列策略,即LinkedBlockingQueue

这个就拿newFixedThreadPool来说,根据前文提到的规则:

如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。那么当任务继续增加,会发生什么呢?

如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。OK,此时任务变加入队列之中了,那什么时候才会添加新线程呢?

如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。这里就很有意思了,可能会出现无法加入队列吗?不像SynchronousQueue那样有其自身的特点,对于无界队列来说,总是可以加入的(资源耗尽,当然另当别论)。换句说,永远也不会触发产生新的线程!corePoolSize大小的线程数会一直运行,忙完当前的,就从队列中拿任务开始运行。所以要防止任务疯长,比如任务运行的实行比较长,而添加任务的速度远远超过处理任务的时间,而且还不断增加,不一会儿就爆了。

例子三:有界队列,使用ArrayBlockingQueue。

这个是最为复杂的使用,所以JDK不推荐使用也有些道理。与上面的相比,最大的特点便是可以防止资源耗尽的情况发生。

举例来说,请看如下构造方法:

new ThreadPoolExecutor(

2, 4, 30, TimeUnit.SECONDS,

new ArrayBlockingQueue

(2),

new RecorderThreadFactory("CookieRecorderPool"),

new ThreadPoolExecutor.CallerRunsPolicy());

假设,所有的任务都永远无法执行完。

对于首先来的A,B来说直接运行,接下来,如果来了C,D,他们会被放到queue中,如果接下来再来E,F,则增加线程运行E,F。但是如果再来任务,队列无法再接受了,线程数也到达最大的限制了,所以就会使用拒绝策略来处理。

keepAliveTime

jdk中的解释是:当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。

有点拗口,其实这个不难理解,在使用了“池”的应用中,大多都有类似的参数需要配置。比如数据库连接池,DBCP中的maxIdle,minIdle参数。

什么意思?接着上面的解释,后来向老板派来的工人始终是“借来的”,俗话说“有借就有还”,但这里的问题就是什么时候还了,如果借来的工人刚完成一个任务就还回去,后来发现任务还有,那岂不是又要去借?这一来一往,老板肯定头也大死了。

合理的策略:既然借了,那就多借一会儿。直到“某一段”时间后,发现再也用不到这些工人时,便可以还回去了。这里的某一段时间便是keepAliveTime的含义,TimeUnit为keepAliveTime值的度量。

RejectedExecutionHandler

另一种情况便是,即使向老板借了工人,但是任务还是继续过来,还是忙不过来,这时整个队伍只好拒绝接受了。

RejectedExecutionHandler接口提供了对于拒绝任务的处理的自定方法的机会。在ThreadPoolExecutor中已经默认包含了4中策略,因为源码非常简单,这里直接贴出来。

CallerRunsPolicy:线程调用运行该任务的 execute 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {

if (!e.isShutdown()) {

r.run();

}

}

这个策略显然不想放弃执行任务。但是由于池中已经没有任何资源了,那么就直接使用调用该execute的线程本身来执行。

AbortPolicy:处理程序遭到拒绝将抛出运行时RejectedExecutionException

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {

throw new RejectedExecutionException("Task " + r.toString() +

" rejected from " +

e.toString());

}

这种策略直接抛出异常,丢弃任务。

DiscardPolicy:不能执行的任务将被删除

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {

}

这种策略和AbortPolicy几乎一样,也是丢弃任务,只不过他不抛出异常。

DiscardOldestPolicy:如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {

if (!e.isShutdown()) {

e.getQueue().poll();

e.execute(r);

}

}

该策略就稍微复杂一些,在pool没有关闭的前提下首先丢掉缓存在队列中的最早的任务,然后重新尝试运行该任务。这个策略需要适当小心。

设想:如果其他线程都还在运行,那么新来任务踢掉旧任务,缓存在queue中,再来一个任务又会踢掉queue中最老任务。

总结:

keepAliveTime和maximumPoolSize及BlockingQueue的类型均有关系。如果BlockingQueue是无界的,那么永远不会触发maximumPoolSize,自然keepAliveTime也就没有了意义。

反之,如果核心数较小,有界BlockingQueue数值又较小,同时keepAliveTime又设的很小,如果任务频繁,那么系统就会频繁的申请回收线程。

相关下载

玩家评论

AMD新款线程撕裂者官方开箱:大盒套小盒,CPU巴掌大

原标题:AMD新款线程撕裂者官方开箱:大盒套小盒,CPU巴掌大 IT之家12月1日消息 不久前,AMD 新款的线程撕裂者3代也上架了,分别是24核的3960X和32核的3970详情>>

阅读: 2
日期: 2019-12-01
众生皆平等:AMD公布线程撕裂者3990X处理器,2020年发售

AMD在昨天晚上解禁了包括线程撕裂者3960X和3970X两款处理器的性能,由于拥有超多的核心,因此在性能尤其是多线程性能取得了恐怖的优势,和老对手英特尔详情>>

阅读: 8
日期: 2019-11-26
AMD速龙金牌3150U曝光:双核四线程,最高3.3GHz

原标题:AMD 速龙金牌3150U曝光:双核四线程,最高3.3GHz IT之家11月14日消息 今天晚上,推特知名爆料人momomo_us曝光了AMD 速龙金牌3150U,双核心四线程,应详情>>

阅读: 8
日期: 2019-11-15
AMD有望在11月5日发布新款线程撕裂者和TRX40芯片组

原标题:AMD有望在11月5日发布新款线程撕裂者和TRX40芯片组 IT之家10月19日消息 根据VideoCardz的独家爆料,AMD计划发布三款Threadripper 3000处理器详情>>

阅读: 4
日期: 2019-10-19
AMDR93950X跑分曝光:比线程撕裂者1950X提升32%

原标题:AMD R9 3950X跑分曝光:比线程撕裂者1950X提升32% IT之家10月19日消息 根据外媒WCCFTech的报道,他们的一个朋友拿到了一块AMD的Ryzen 3950X,并详情>>

阅读: 7
日期: 2019-10-19
AMD第三代线程撕裂者曝光32核性能暴增

原标题:AMD第三代线程撕裂者曝光 32核性能暴增 根据今年3月份曝光的AMD产品线路图来看,第三代线程撕裂者有望在今年年内发布,但随后在6月举行的台北详情>>

阅读: 4
日期: 2019-09-02
超线程真的很重要?玩游戏究竟选Core i5还是E3-1230?

-->   在论坛和Q群里经常有人讨论装机的时候究竟是用Xeon E3-1230 V2/V3还是用Core i5处理器这个问题,这两种处理器的售价非常接近,详情>>

阅读: 24
日期: 2019-06-13
DX12释放多线程性能 AMD/Intel CPU谁更值得期待?

-->   也许现在还有许多用户觉得Windows 7这一即将被“取缔”的老系统要比当前的最新版系统Windows 10要好用无数倍(笔者自己也这么认为),因为详情>>

阅读: 23
日期: 2019-06-13
Intel酷睿i9正式公布!18核心36线程,售价13698元

英特尔作为“挤牙膏”大户,其新产品的公布速度一直备受用户所嫌弃。不过就在今天,英特尔一反常态,正式公布了14nm+制程的Skylake-X和KabyLake详情>>

阅读: 7
日期: 2019-04-20
蓝贴:8.1.5新增加图形API DX11选项多线程支持

  DirectX11多线程支持  在8.1.5补丁中,我们对魔兽世界在DirectX方面做出了一些改进。简而言之,原来的“DirectX11”选项现在改名为“DirectX详情>>

阅读: 0
日期: 2019-03-17
蓝贴:8.15新增加图形API DirectX11选项多线程支持

本文来源于NGACN,作者:UID14092353;原文地址:【点我查看】转载请注明出处!DirectX11多线程支持详情>>

阅读: 5
日期: 2019-03-13
4核8线程PK标压HQ!8代酷睿i7 8550U测试

不过还是比i7 7820HK系列差了很多(i7 7820HK 锁...之前双核系列低电压七代酷睿在守望先锋中表现不佳,... 详情>>

阅读: 5
日期: 2018-12-20
8核16线程 AMD Ryzen 7 2700 X售2288元

AMD Ryzen 7 2700 X拥有8核16线程,基础主频3.7GHz,加速4.3GHz,功耗105W。入门的Ryzen 5 2600拥有6核12线程,基础主频3.4GHz,加速3.9GHz,功耗机65W。现有... 详情>>

阅读: 1
日期: 2018-10-05
《鬼泣5》PC配置需求公布:最低八线程i7-4770K

卡普空近日正式公布了《鬼泣5》(DeviMayCry5)的PC版硬件配置需求,最大亮点不是显卡而是详情>>

阅读: 0
日期: 2018-09-24
AMD 7nm级处理器跑分曝光:64核128线程明年发售

  这一年多来,AMDRyzen锐龙处理器在消费级市场上攻城略地,EPYC霄龙处理器则在服务器和数据中心市场上披荆斩棘,赢得了大量客户的信赖,打破了Intel多年来的垄断局面。  EPYC霄龙详情>>

阅读: 4
日期: 2018-09-17
Spring 中获取 request 的几种方法,及其线程安全性分析

关键时刻,第一时间送达!来源:编程迷思概述在使用SpringMVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址、请求的url、header中的属性(如coo详情>>

阅读: 7
日期: 2018-08-27
【尴尬】热门手游开放多线程 所有机型都能用 厂商钱白掏了?

昨天晚上,《王者荣耀》官方发布公告,抢先服于今天更新“三分之地”版本,同时也将正式迎来S12赛季。除了游戏内容更新,更能让《王者荣耀》玩家开心的是,新版本将开放多线程模式。(ov流下亏钱的泪水?游戏详情>>

阅读: 2
日期: 2018-08-26
告诉你什么是java多线程定义及线程安全

1、什么是java多线程?举个简单易懂的例子,多线程相当于一条马路上的多条车道,单车道行驶车辆速度较慢,且可能产生拥堵,多车道可缓解车速、拥堵情况。线程是指进程中的一个执行流程,一个进程中可以运行1详情>>

阅读: 7
日期: 2018-08-26
AMD锐龙处理器具有多线程优势,真的能战未来吗?

AMD锐龙处理器一直以多线程的优势来吸引消费者,但是软件或者游戏的开发往往是漫长的,优化并不是那么迅速,例如平民级别的处理器达到了8核16线程,因此消费者给AMD附属了战未来的称号。那么事实上真的能详情>>

阅读: 3
日期: 2018-08-26
python线程 多线程 线程池使用场景实例

多线程,线程池测试:Python使用多线程,有两种方式:函数,或者用类来包装线程对象。现在有一个需求:如下图,我们需要把test.jpg复制5000次到update文件夹下面。并且在复制过程中详情>>

阅读: 4
日期: 2018-08-26
AMD第一代线程撕裂者大降价 便宜了一半还多

原标题:AMD第一代线程撕裂者大降价便宜了一半还多AMD线程撕裂者第二代产品发布之后,第一代产品进行了调价。相比首发价格,一代线程撕裂者降价幅度非常大,1950X、1920X和1900X三款产品零详情>>

阅读: 6
日期: 2018-08-25
Intel或9月推出8核16线程Coffee Lake Refresh

先前一度传闻Intel可能会在今年Computex公布基于CoffeeLake的8核心16线程i7处理器,以及传说中为因应其供电需求推出的Z390主板,不过最终在Computex上,Intel仅公详情>>

阅读: 3
日期: 2018-08-23
AMD线程撕裂者CPU大降价:5799元就能买16核32线程处理器

在发烧级HEDT平台上,AMD去年推出了第一代的线程撕裂者RyzenThreadripper19XX系列处理器,最多16核32线程,前不久又推出了第二代的RyzenThreadripper2详情>>

阅读: 3
日期: 2018-08-23
unity 为什么避免使用 多线程

小编为您搜罗的答案:不只Unity,大多数游戏引擎都是单线程的,因为大多数引擎都是主循环结构,逻辑更新和画面更新的时间点要求有确定性,如果在逻辑更新和画面更新中引入多线程,就需要做同步而这加大了游戏性详情>>

阅读: 5
日期: 2018-08-22
多线程如何传递多个参数

小编为您搜罗的答案:  多线程传递多个参数可以通过以下方法来实现  typedefstruct{void*arg1;void*arg2;详情>>

阅读: 5
日期: 2018-08-21
一个java多线程编写中的小问题!请大家帮助呀,谢谢了!

小编为您搜罗的答案:///有个小错误~~~改好了publicclassThreadTest{publicstaticvoidmain(String[]args){Hellot1=ne详情>>

阅读: 3
日期: 2018-08-21
【oO】怎么获得当前线程的looper

小编为您搜罗的答案:  Looper.prepare()方法在当前线程里面调用,目的是创建一个新的Looper,且一个线程只能创建一个Looper.  publicstaticvoidprepa详情>>

阅读: 7
日期: 2018-08-20
AMD 32核心64线程旗舰级处理器开卖 售价1800美元

网页游戏 传奇单机版 | 地狱十九层 | 天堂转职 | 贪玩蓝月 | 2018新版传奇 | 皇上吉祥2 | 大天使之剑 | 热血传奇 | 三国之志2 | 山海经 | 天堂契约 | ... 详情>>

阅读: 7
日期: 2018-08-06
AMD 32核“线程撕裂者”处理器ChinaJoy首秀

而AMD也在E4展馆拥有自己的展厅,根据小编踩点的情况显示,AMD已经在今年的ChinaJoy上展示了最新第二代“线程撕裂者”处理器,同时还展出了基于第二代锐龙处理器组建... 详情>>

阅读: 4
日期: 2018-08-06
新线程撕裂者包装曝光外观酷炫极具收藏价值

详情>>

阅读: 4
日期: 2018-08-05
AMD线程撕裂者2990WX现身,32C64T上4.1G!

自从上次台湾Computex电脑展一来,AMD的二代RyzenThreadRipper线程撕裂者处理器消息从未停歇,眼看着发布在即,国外甚至已经曝光了上手消息。据说AMD在意大利召开了一个小型发布详情>>

阅读: 7
日期: 2018-08-03
Java架构之Redis单线程理解

从接触Redis到现在,一直被它的单线程问题困扰,这对于一个苛求原理的我来说是种折磨,今天吃饭途中看了几篇博客,茅塞顿开。个人理解数据返回)。平时所说的redis单线程模型,本质上指的是服务端的数据详情>>

阅读: 10
日期: 2018-08-01
32 核心 64 线程:AMD 线程撕裂者新旗舰 2990X 现身 3DMark

AMD在台北电脑展上宣布了第二代线程撕裂者,最多32核心64线程,比一代翻番,而旗舰型号将是RyzenThreadRipper2990X。现在,3DMark里已经出现了2990X详情>>

阅读: 9
日期: 2018-07-28
王者荣耀苹果多线程怎么开 ios多线程开启教程分享

王者荣耀苹果多线程怎么开,在哪的详情>>

阅读: 9
日期: 2018-07-05
装机模拟器线程撕裂者匹配散热器汇总 线程撕裂者用什么散热

  装机模拟器中要求玩家根据实际情况组装电脑,但是玩家在组装电脑时也会出现找不到与之匹配的零件的情况,比如这位玩家就是线程撕裂者找不到与之匹配的散热器,详情>>

阅读: 19
日期: 2018-07-05
王者荣耀多线程模式怎么开启 多线程模式开启条件有哪些

王者荣耀进入到了新赛季中,很多人详情>>

阅读: 9
日期: 2018-07-04
9代酷睿旗舰i9-9900K曝光 8核16线程中的性能王者?

原标题:9代酷睿旗舰i9-9900K曝光8核16线程中的性能王者?【PConline资讯】去年Intel就推出一个全新的处理器系列i9,不过这个系列目前只存在于Skylake-X家族,是象征着性详情>>

阅读: 5
日期: 2018-06-30
热门手游开放多线程 所有机型都能用 厂商钱白掏了?

昨天晚上,《王者荣耀》官方发布公告,抢先服于今天更新“三分之地”版本,同时也将正式迎来S12赛季。除了游戏内容更新,更能让《王者荣耀》玩家开心的是,新版本将开放多线程模详情>>

阅读: 11
日期: 2018-06-29
AMD 32核64线程处理器上架 售价逆天

  导语:“四边伐鼓雪海涌,三军大呼阴山动。”冷兵器骑战网游《战意》东西方对抗赛,将于2018年6月29日拉开战幕。表现优异的将军不但能够获得丰厚的奖励,荣耀加身,还可为所在地块全部成员赢得惊喜详情>>

阅读: 4
日期: 2018-06-28
调整这个东西,你的下载器可能会起飞,关于线程那些事 IDM提高线程

调整这个东西,你的下载器可能会起飞,关于线程那些事 IDM提高线程详情>>

阅读: 3
日期: 2018-06-26
性能远超GTX 1060!最强核显AMD新4核8线程处理器现身

最近,集成AMD最新的图形处理器的CPU为Intel/AMD联合处理器,也就是Inteli7-8809详情>>

阅读: 4
日期: 2018-06-04
性能远超GTX 1060!最强核显AMD新4核8线程处理器现身

  最近,集成AMD最新的图形处理器的CPU为Intel/AMD联合处理器,也就是Inteli7-8809G,拥有着超越GTX1060的集成显卡详情>>

阅读: 6
日期: 2018-06-03
精彩推荐
精品推荐
换一换