ava 线程返回值,休眠,优先级,后台线程 示例代码
package org.rui.thread.basic;
import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 从任务中产生返回值 Callable接口应用
* 也可以用isDone()来查询Future是否已经完成
* 也可以直接get()进行检查
*
* @author lenovo
*
*/
class TaskWithResult implements Callable
{
private int id;
public TaskWithResult(int id){this.id=id;}
@Override
public String call() throws Exception {
return "result of TaskWotjResult"+id;
}
}
public class CallableDemo {
/////////////////
public static void main(String[] args) {
ExecutorService exec=Executors.newCachedThreadPool();
ArrayList> result=new ArrayList>();
for(int i=0;i<10;i++)
{
result.add(exec.submit(new TaskWithResult(i)));
}
for(Future fs:result)
try {
System.out.println(fs.get());
} catch (InterruptedException e) {
e.printStackTrace();
return;
} catch (ExecutionException e) {
e.printStackTrace();
}finally
{
exec.shutdown();
}
}
}
/**
* output:
result of TaskWotjResult0
result of TaskWotjResult1
result of TaskWotjResult2
result of TaskWotjResult3
result of TaskWotjResult4
result of TaskWotjResult5
result of TaskWotjResult6
result of TaskWotjResult7
result of TaskWotjResult8
result of TaskWotjResult9
*/
package org.rui.thread.basic;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 线程优先级
* @author lenovo
*
*/
public class SimpleProorities implements Runnable{
private int countDown=5;
private volatile double d; //No optimization
private int priority;
public SimpleProorities(int priority)
{
this.priority=priority;
}
public String toString()
{
return Thread.currentThread()+" : "+countDown;
}
@Override
public void run() {
Thread.currentThread().setPriority(priority);//开头设置优先级
while(true)
{
for(int i=1;i<100000;i++)
{
//比任何其他值都更接近 pi(即圆的周长与直径之比)的 double 值。
//任何其他值都更接近 e(即自然对数的底数)的 double 值。
d+=(Math.PI+Math.E)/(double)i;
if(i%1000==0)
Thread.yield();
}
System.out.println(this);
if(--countDown==0)return;
}
}
public static void main(String[] args) {
ExecutorService exec=Executors.newCachedThreadPool();
for(int i=0;i<5;i++)
exec.execute(new SimpleProorities(Thread.MIN_PRIORITY));
exec.execute(new SimpleProorities(Thread.MAX_PRIORITY));//优先级高
exec.shutdown();
}
}
package org.rui.thread.basic;
import java.util.concurrent.TimeUnit;
/**
* 后台线程
* 是指在程序运行的时候在后台提供一种通用服务的线程
* @author lenovo
*
*/
public class SimpleDeamons implements Runnable{
@Override
public void run() {
try {
while(true)
{
TimeUnit.MILLISECONDS.sleep(100);
System.out.println(Thread.currentThread()+" >>> "+this);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
for(int i=0;i<10;i++)
{
Thread daemon=new Thread(new SimpleDeamons());
daemon.setDaemon(true);//设为后台 线程
daemon.start();
}
System.out.println("all daemons started------");
try {
//试试调整休眠时间 以观察这个行为
TimeUnit.MILLISECONDS.sleep(175);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* output:
all daemons started------
Thread[Thread-8,5,main] >>> org.rui.thread.basic.SimpleDeamons@1e4f7c2
Thread[Thread-9,5,main] >>> org.rui.thread.basic.SimpleDeamons@10dc6b5
Thread[Thread-4,5,main] >>> org.rui.thread.basic.SimpleDeamons@1d0fafc
Thread[Thread-6,5,main] >>> org.rui.thread.basic.SimpleDeamons@c9d92c
Thread[Thread-0,5,main] >>> org.rui.thread.basic.SimpleDeamons@145f0e3
Thread[Thread-2,5,main] >>> org.rui.thread.basic.SimpleDeamons@1e4f7c2
Thread[Thread-5,5,main] >>> org.rui.thread.basic.SimpleDeamons@b8f8eb
Thread[Thread-1,5,main] >>> org.rui.thread.basic.SimpleDeamons@d0af9b
Thread[Thread-7,5,main] >>> org.rui.thread.basic.SimpleDeamons@f47396
Thread[Thread-3,5,main] >>> org.rui.thread.basic.SimpleDeamons@170bea5
*/
package org.rui.thread.basic;
import java.util.concurrent.ThreadFactory;
/**
*通过编写定制的threadFactory可以定制由Executor创建的线程的属性 (后台,优先级,名称)
* @author lenovo
*
*/
public class DaemonThreadFactory implements ThreadFactory{
@Override
public Thread newThread(Runnable r) {
Thread thread=new Thread(r);
thread.setDaemon(true);
return thread;
}
}
package org.rui.thread.basic;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* 这与普通的ThreadFactory的唯一差异就是它将后台状态全部设置为了true
* 你现在可以用一个新的DaemonThreadFactory作为参数传递给executory.newCachedThreadPool()
* @author lenovo
*
*/
public class DeamonFromFactory implements Runnable{
@Override
public void run() {
try {
while(true)
{
TimeUnit.MILLISECONDS.sleep(100);
System.out.println(Thread.currentThread()+" >> "+this);
}
} catch (Exception e) {
}
}
/////
public static void main(String[] args) throws InterruptedException {
//每一个ExecutorService创建方法都被重载为接受一个threadfactory对象
//而这个对象将被用来创建新的线程
ExecutorService exec=Executors.newCachedThreadPool(new DaemonThreadFactory());
for(int i=0;i<10;i++)
{
exec.execute(new DeamonFromFactory());
}
System.out.println("all daemons started");
TimeUnit.MILLISECONDS.sleep(500);
}
}
/**output:
all daemons started
Thread[Thread-0,5,main] >> org.rui.thread.basic.DeamonFromFactory@8ab708
Thread[Thread-3,5,main] >> org.rui.thread.basic.DeamonFromFactory@9934d4
Thread[Thread-5,5,main] >> org.rui.thread.basic.DeamonFromFactory@f6ac0b
Thread[Thread-4,5,main] >> org.rui.thread.basic.DeamonFromFactory@1c0f2e5
Thread[Thread-2,5,main] >> org.rui.thread.basic.DeamonFromFactory@13c7378
Thread[Thread-1,5,main] >> org.rui.thread.basic.DeamonFromFactory@54c4ad
Thread[Thread-6,5,main] >> org.rui.thread.basic.DeamonFromFactory@5b8827
Thread[Thread-7,5,main] >> org.rui.thread.basic.DeamonFromFactory@d09ad3
Thread[Thread-8,5,main] >> org.rui.thread.basic.DeamonFromFactory@147c1db
Thread[Thread-9,5,main] >> org.rui.thread.basic.DeamonFromFactory@82d37
Thread[Thread-0,5,main] >> org.rui.thread.basic.DeamonFromFactory@8ab708
Thread[Thread-5,5,main] >> org.rui.thread.basic.DeamonFromFactory@f6ac0b
Thread[Thread-3,5,main] >> org.rui.thread.basic.DeamonFromFactory@9934d4
Thread[Thread-1,5,main] >> org.rui.thread.basic.DeamonFromFactory@54c4ad
Thread[Thread-4,5,main] >> org.rui.thread.basic.DeamonFromFactory@1c0f2e5
Thread[Thread-2,5,main] >> org.rui.thread.basic.DeamonFromFactory@13c7378
Thread[Thread-6,5,main] >> org.rui.thread.basic.DeamonFromFactory@5b8827
Thread[Thread-8,5,main] >> org.rui.thread.basic.DeamonFromFactory@147c1db
Thread[Thread-7,5,main] >> org.rui.thread.basic.DeamonFromFactory@d09ad3
Thread[Thread-9,5,main] >> org.rui.thread.basic.DeamonFromFactory@82d37
Thread[Thread-5,5,main] >> org.rui.thread.basic.DeamonFromFactory@f6ac0b
Thread[Thread-1,5,main] >> org.rui.thread.basic.DeamonFromFactory@54c4ad
Thread[Thread-0,5,main] >> org.rui.thread.basic.DeamonFromFactory@8ab708
Thread[Thread-3,5,main] >> org.rui.thread.basic.DeamonFromFactory@9934d4
Thread[Thread-7,5,main] >> org.rui.thread.basic.DeamonFromFactory@d09ad3
Thread[Thread-4,5,main] >> org.rui.thread.basic.DeamonFromFactory@1c0f2e5
Thread[Thread-2,5,main] >> org.rui.thread.basic.DeamonFromFactory@13c7378
Thread[Thread-6,5,main] >> org.rui.thread.basic.DeamonFromFactory@5b8827
Thread[Thread-8,5,main] >> org.rui.thread.basic.DeamonFromFactory@147c1db
Thread[Thread-9,5,main] >> org.rui.thread.basic.DeamonFromFactory@82d37
Thread[Thread-1,5,main] >> org.rui.thread.basic.DeamonFromFactory@54c4ad
Thread[Thread-5,5,main] >> org.rui.thread.basic.DeamonFromFactory@f6ac0b
Thread[Thread-3,5,main] >> org.rui.thread.basic.DeamonFromFactory@9934d4
Thread[Thread-0,5,main] >> org.rui.thread.basic.DeamonFromFactory@8ab708
Thread[Thread-8,5,main] >> org.rui.thread.basic.DeamonFromFactory@147c1db
Thread[Thread-6,5,main] >> org.rui.thread.basic.DeamonFromFactory@5b8827
Thread[Thread-2,5,main] >> org.rui.thread.basic.DeamonFromFactory@13c7378
Thread[Thread-4,5,main] >> org.rui.thread.basic.DeamonFromFactory@1c0f2e5
Thread[Thread-7,5,main] >> org.rui.thread.basic.DeamonFromFactory@d09ad3
Thread[Thread-9,5,main] >> org.rui.thread.basic.DeamonFromFactory@82d37
Thread[Thread-0,5,main] >> org.rui.thread.basic.DeamonFromFactory@8ab708
Thread[Thread-3,5,main] >> org.rui.thread.basic.DeamonFromFactory@9934d4
Thread[Thread-1,5,main] >> org.rui.thread.basic.DeamonFromFactory@54c4ad
Thread[Thread-5,5,main] >> org.rui.thread.basic.DeamonFromFactory@f6ac0b
Thread[Thread-8,5,main] >> org.rui.thread.basic.DeamonFromFactory@147c1db
Thread[Thread-6,5,main] >> org.rui.thread.basic.DeamonFromFactory@5b8827
Thread[Thread-2,5,main] >> org.rui.thread.basic.DeamonFromFactory@13c7378
Thread[Thread-4,5,main] >> org.rui.thread.basic.DeamonFromFactory@1c0f2e5
Thread[Thread-7,5,main] >> org.rui.thread.basic.DeamonFromFactory@d09ad3
*/
package org.rui.thread.basic;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 每个静态的executorService创建方法都被重载为接受一个threadfactory对象,
* 而这个对象将被用来创建新的线程
* @author lenovo
*
*/
public class DaemonThreadPoolExecutor extends ThreadPoolExecutor {
public DaemonThreadPoolExecutor() {
super(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,
new SynchronousQueue(),
new DaemonThreadFactory());
}
}
package org.rui.thread.basic;
import java.util.concurrent.TimeUnit;
/**
* 可以通过调用isDaemon方法来确定线程是否是一个后台线程。如果是一个后台线程,
* 那么创建的任何线程将被自动设置成后台线程,如下例所示
* @author lenovo
*
*/
class Daemon implements Runnable {
private Thread[] t=new Thread[10];
@Override
public void run() {
for(int i=0;i
package org.rui.thread.basic;
import java.util.concurrent.TimeUnit;
/**
* 你就该意识到后台进程在不执行finally子句的情况下就会终止其run()方法
* @author lenovo
*
*/
class ADeamon implements Runnable{
@Override
public void run() {
try {
System.out.println("starting adaemon");
TimeUnit.MILLISECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.println("正在退出 经过 InterruptedException");
}finally
{
//这应该 run?
System.out.println("this should always run?");
}
}
}
public class DaemonDontRunFinally {
//你将看到finally子句不会执行 如果注释t.setDaemon(true); 就会看到
public static void main(String[] args) {
Thread t=new Thread(new ADeamon());
t.setDaemon(true);
t.start();
//一旦main退出 jvm就会立即关闭后台线程
}
}
/**output:
starting adaemon
*/