1.
类
Executors
此类中提供的一些方法有:
1.1 public static ExecutorService newCachedThreadPool()
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。
1.2 public static ExecutorService newFixedThreadPool(int nThreads)
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
1.3 public static ExecutorService newSingleThreadExecutor()
创建一个使用单个
worker
线程的
Executor
,以无界队列方式来运行该线程。
这三个方法都可以配合接口
ThreadFactory
的实例一起使用。并且返回一个
ExecutorService
接口的实例。
2.
接口
ThreadFactory
根据需要创建新线程的对象。使用线程工厂就无需再手工编写对
new Thread
的调用了,从而允许应用程序使用特殊的线程子类、属性等等。
此接口最简单的实现就是:
class SimpleThreadFactory implements ThreadFactory {
public Thread newThread(Runnable r) {
return new Thread(r);
}
}
|
3.
接口
ExecutorService
该接口提供了管理终止的方法。
4.
创建标准线程池启动线程
4.1
提供一个简单的实现
Runnable
接口的线程
MyThread.java
package
com.zj.concurrency.executors;
public
class
MyThread
implements
Runnable {
private
int
count
= 1,
number
;
public
MyThread(
int
num) {
number
= num;
System.
out
.println(
"Create Thread-"
+
number
);
}
public
void
run() {
while
(
true
) {
System.
out
.println(
"Thread-"
+
number
+
" run "
+
count
+
" time(s)"
);
if
(++
count
== 3)
return
;
}
}
}
|
这个线程会打印出相应的创建和执行信息。
4.2
使用
CachedThreadPool
启动线程
CachedThreadPool.java
package
com.zj.concurrency.executors;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
public
class
CachedThreadPool {
public
static
void
main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for
(
int
i = 0; i < 5; i++)
exec.execute(
new
MyThread(i));
exec.shutdown();
}
}
|
结果:
Create Thread-0
Create Thread-1
Create Thread-2
Create Thread-3
Thread-0 run 1 time(s)
Thread-0 run 2 time(s)
Thread-1 run 1 time(s)
Thread-1 run 2 time(s)
Thread-2 run 1 time(s)
Thread-2 run 2 time(s)
Create Thread-4
Thread-4 run 1 time(s)
Thread-4 run 2 time(s)
Thread-3 run 1 time(s)
Thread-3 run 2 time(s)
4.3
使用
FixedThreadPool
启动线程
FixedThreadPool.java
package
com.zj.concurrency.executors;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
public
class
FixedThreadPool {
public
static
void
main(String[] args) {
ExecutorService exec = Executors.newFixedThreadPool(2);
for
(
int
i = 0; i < 5; i++)
exec.execute(
new
MyThread(i));
exec.shutdown();
}
}
|
结果:
Create Thread-0
Create Thread-1
Create Thread-2
Create Thread-3
Create Thread-4
Thread-0 run 1 time(s)
Thread-0 run 2 time(s)
Thread-2 run 1 time(s)
Thread-2 run 2 time(s)
Thread-3 run 1 time(s)
Thread-3 run 2 time(s)
Thread-4 run 1 time(s)
Thread-4 run 2 time(s)
Thread-1 run 1 time(s)
Thread-1 run 2 time(s)
4.4
使用
SingleThreadExecutor
启动线程
SingleThreadExecutor.java
package
com.zj.concurrency.executors;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
public
class
SingleThreadExecutor {
public
static
void
main(String[] args) {
ExecutorService exec = Executors.newSingleThreadExecutor();
for
(
int
i = 0; i < 5; i++)
exec.execute(
new
MyThread(i));
exec.shutdown();
}
}
|
结果:
Create Thread-0
Create Thread-1
Create Thread-2
Create Thread-3
Create Thread-4
Thread-0 run 1 time(s)
Thread-0 run 2 time(s)
Thread-1 run 1 time(s)
Thread-1 run 2 time(s)
Thread-2 run 1 time(s)
Thread-2 run 2 time(s)
Thread-3 run 1 time(s)
Thread-3 run 2 time(s)
Thread-4 run 1 time(s)
Thread-4 run 2 time(s)
5.
配合
ThreadFactory
接口的使用
我们试图给线程加入
daemon
和
priority
的属性设置。
5.1
设置后台线程属性
DaemonThreadFactory.java
package
com.zj.concurrency.executors.factory;
import
java.util.concurrent.ThreadFactory;
public
class
DaemonThreadFactory
implements
ThreadFactory {
public
Thread newThread(Runnable r) {
Thread t =
new
Thread(r);
t.setDaemon(
true
);
return
t;
}
}
|
5.2
设置优先级属性
最高优先级
MaxPriorityThreadFactory.java
package
com.zj.concurrency.executors.factory;
import
java.util.concurrent.ThreadFactory;
public
class
MaxPriorityThreadFactory
implements
ThreadFactory {
public
Thread newThread(Runnable r) {
Thread t =
new
Thread(r);
t.setPriority(Thread.
MAX_PRIORITY
);
return
t;
}
}
|
最低优先级
MinPriorityThreadFactory.java
package
com.zj.concurrency.executors.factory;
import
java.util.concurrent.ThreadFactory;
public
class
MinPriorityThreadFactory
implements
ThreadFactory {
public
Thread newThread(Runnable r) {
Thread t =
new
Thread(r);
t.setPriority(Thread.
MIN_PRIORITY
);
return
t;
}
}
|
5.3
启动带有属性设置的线程
ExecFromFactory.java
package
com.zj.concurrency.executors;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
com.zj.concurrency.executors.factory.DaemonThreadFactory;
import
com.zj.concurrency.executors.factory.MaxPriorityThreadFactory;
import
com.zj.concurrency.executors.factory.MinPriorityThreadFactory;
public
class
ExecFromFactory {
public
static
void
main(String[] args)
throws
Exception {
ExecutorService defaultExec = Executors.newCachedThreadPool();
ExecutorService daemonExec = Executors
.newCachedThreadPool(
new
DaemonThreadFactory());
ExecutorService maxPriorityExec = Executors
.newCachedThreadPool(
new
MaxPriorityThreadFactory());
ExecutorService minPriorityExec = Executors
.newCachedThreadPool(
new
MinPriorityThreadFactory());
for
(
int
i = 0; i < 10; i++)
daemonExec.execute(
new
MyThread(i));
for
(
int
i = 10; i < 20; i++)
if
(i == 10)
maxPriorityExec.execute(
new
MyThread(i));
else
if
(i == 11)
minPriorityExec.
execute(new MyThread(i));
else
defaultExec.execute(
new
MyThread(i));
}
}
|
结果:
Create Thread-0
Create Thread-1
Create Thread-2
Create Thread-3
Thread-0 run 1 time(s)
Thread-0 run 2 time(s)
Thread-1 run 1 time(s)
Thread-1 run 2 time(s)
Thread-2 run 1 time(s)
Thread-2 run 2 time(s)
Create Thread-4
Thread-4 run 1 time(s)
Thread-4 run 2 time(s)
Create Thread-5
Thread-5 run 1 time(s)
Thread-5 run 2 time(s)
Create Thread-6
Create Thread-7
Thread-7 run 1 time(s)
Thread-7 run 2 time(s)
Create Thread-8
Thread-8 run 1 time(s)
Thread-8 run 2 time(s)
Create Thread-9
Create Thread-10
Thread-10 run 1 time(s)
Thread-10 run 2 time(s)
Create Thread-11
Thread-9 run 1 time(s)
Thread-9 run 2 time(s)
Thread-6 run 1 time(s)
Thread-6 run 2 time(s)
Thread-3 run 1 time(s)
Thread-3 run 2 time(s)
Create Thread-12
Create Thread-13
Create Thread-14
Thread-12 run 1 time(s)
Thread-12 run 2 time(s)
Thread-13 run 1 time(s)
Thread-13 run 2 time(s)
Create Thread-15
Thread-15 run 1 time(s)
Thread-15 run 2 time(s)
Create Thread-16
Thread-16 run 1 time(s)
Thread-16 run 2 time(s)
Create Thread-17
Create Thread-18
Create Thread-19
Thread-14 run 1 time(s)
Thread-14 run 2 time(s)
Thread-17 run 1 time(s)
Thread-17 run 2 time(s)
Thread-18 run 1 time(s)
Thread-18 run 2 time(s)
Thread-19 run 1 time(s)
Thread-19 run 2 time(s)
Thread-11 run 1 time(s)
Thread-11 run 2 time(s)
本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/70068