1,信号量 的使用
private void text2() {
//信号 量,允许个数,超过数量时会 阻塞线程
semaphore = new Semaphore(5);
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
method2();
}
}).start();
}
}
private void method2() {
Log.i("qq--" + Thread.currentThread().getName(), "开始");
try {
//获取 一把锁
semaphore.acquire();
Thread.currentThread().sleep(1000);
//释放 一把锁
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("qq--" + Thread.currentThread().getName(), "结束");
}
2,线程池 Executors
/*线程池*/
private void text3() {
executorService = Executors.newCachedThreadPool();
Executors.newFixedThreadPool(5);//固定线程池
Executors.newScheduledThreadPool(5);//计划任务线程池
Executors.newSingleThreadExecutor();//单个线程池
for (int i = 0; i < 100; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
method3();
}
});
}
}
private void method3() {
Log.i("qq--" + Thread.currentThread().getName(), "开始");
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("qq--" + Thread.currentThread().getName(), "结束");
}
3,线程池 ThreadPoolExecutor
/*ThreadPoolExecutor 线程池有一个 线程集合,和一个任务队列
核心池容量,最大线程量,任务完成之后 延时多久“裁人”,
延时时间单位,存储工作任务的队列,线程工厂*/
private void text4() {
//工作任务的队列 的最大任务个数
LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(100);
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 5,
10L, TimeUnit.MINUTES,
queue, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
return thread;
}
});
for (int i = 0; i < 100; i++) {
poolExecutor.execute(new Runnable() {
@Override
public void run() {
method4();
//线程安全 的Integer 包装类
new AtomicInteger(1);
new Integer(1);
}
});
}
}
private void method4() {
Log.i("qq--" + Thread.currentThread().getName(), "开始");
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("qq--" + Thread.currentThread().getName(), "结束");
}
转载请注明原文地址: https://ju.6miu.com/read-32858.html