多线程的编程细节

Thread类:

Thread类实现了Runnable接口,所以Thread类对象也是Runnable对象

Thread() //一般用于在Thread类中覆盖定义run方法,可以使用匿名内部类的方式进行定义

Thread(Runnable) //使用最多的情形,run方法是通过Runnable对象提供的

Thread(String) //创建线程对象的同时设置线程名称

Thread(Runnable,String)

//常见的简化写法
Thread t=new Thread(()->{
System.out.println(Thread.currentThread());
});
t.start();
方法说明
void start()

使该线程对象开始执行,处于就绪状态,注意不是立即执行

JVM调用的是该线程对象的run方法

void run()

线程的执行体,其中是当前线程的具体处理逻辑
void setName(String) 改变该线程对象的名称
void setPriority(int)更改该线程对象的优先级,Java中线程的优先级可以分为1-10整数,默认为5。优先级越高则获取更多的运行机会
void setDaemon(boolean)设置该线程对象为守护线程,一般守护线程中使用的都是死循环,在所有的非守护线程退出后自动关闭
void join()/join(long)等待该线程对象终止,调用的当前线程会阻塞等待,如果有参数long则表示最多等待long毫秒
void interrupt()中断该线程,不是中断线程的执行,而是修改中断参数
boolean isActive()判断该线程对象是否处于活跃状态。活跃状态是指线程已经启动但是还没有终止
static void yield()暂停正在执行的线程对象,并执行其它线程。具体执行哪个线程取决于系统的线程调度机制,也可有可能该线程对象再次运行
static void sleep(long)在指定的long毫秒数的时间内使当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响
static Thread currrentThread()返回当前正在执行的线程对象的引用

 

Runnable接口: 

 Runnable接口中只定义了一个方法public void run(),Runnable对象一般称为可运行对象,而一个线程对象运行的就是Runnable对象中的run方法

注意:run方法没有返回值,而且不能抛出异常

代码实现:

public class Test01 {
		static class  MyRunnable implements Runnable{
		public void run(){ 
			}
		}

	// 简化写法
	new Thread(()->{
		for (int i = 0; i < 100; i++) {
			System.out.println("左");
			try {
				Thread.sleep(100); // 这里有一个受检型异常,因为run不允许抛出异常,所以必须使用try/catch进行处理
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}).start();
}

 

 Callable接口:

继承Thread类或者实现Runnable接口都有一个缺陷:在执行完成后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量的方式来实现,这样使用非常的麻烦。引入Callable接口的目的就是获取执行结果
Thread和Runnable都在java.lang包中,而Callable是在juc包java.util.concurrent
Callable接口中有一个方法call,call方法要求有返回值,这个返回值可以通过泛型进行约束,并且允许抛出异常

 代码实现:

public class MyCallable implements Callable<Number> {
    public Number call() throws Exception{
    return 100; --- int
    return 100.0; --- double
} // call方法的返回值类型要和Callable接口后面<>中的类型一致。数值型的包装类的父类型就是Number}

//简化写法
	new Thread(new FutureTask<>(()->{
		for (
			int i = 0; i < 10; i++) {
			System.out.println("右手画彩虹");
			Thread.sleep(30);// 允许抛出异常
		}
		return 10; // 必须有返回值
})).start();

 

Future接口:

Future接口对象用于表示一个任务的生命周期,提供了一组方法用于判断是否已经完成或者取消,以及获取任务的执行结果或取消任务。必要时可以通过get()方法获取线程的执行结果,该方法可以阻塞当前线程直到任务结束为止或者超时

cancel方法:用于取消任务。如果取消成功则返回true,否则false。
isCancelled方法:用于获取任务是否被成功取消。任务正常完成前被取消则返回true
isDone方法:表示任务是否已经完成,如果已经完成返回true
get():获取执行结果,这个方法会产生阻塞,直到任务执行完毕才返回
get(long,TimeUnit):获取执行结果,这个方法会阻塞一段时间,直到任务执行完毕或者超过指定时间才返回。如果在指定时间内没有获取到结果则产生超时异常

FutureTask类:

FutureTask实现了两个接口Runnable和Future,所以它既可以作为Runnable被线程执行,也可以作为Future获取Callable的返回值
FutureTask是一个可取消的异步计算,FutureTask实现了Future接口的基本方法,提供了cancel操作,可以查询是否已经完成,并获取最终的计算结果。结果只能在计算完成后获取,get方法具备阻塞等待的功能,一旦计算完成,那么计算就不能再次启动或者取消

 代码实现:

Callable<Integer> callable=new MyCallable();
FutureTask<Integer> future=new FutureTask<>(callable);
new Thread(future).start();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值