多线程编码细节1

Thread类

Thread类实现了Runnable接口,所以Thread对象也是可运行Runnable对象,同时Thread类也是线程类

Thread类定义

  • Thread()//一般用于在Thread类中覆盖定义run方法,可以使用匿名内部类进行定义
  • Thread(Runnable)//使用最多的情况,run方式是由Runnable参数对象提供
  • Thread(String name) //自定义线程名称
  • Thread(Runnable,String name)

由于Runnable接口属于函数式接口,所以一般使用简化写法
Thread t = new Thread(()->{
    System.out.println(Thread.currentThread());
});
t.start();

常见方法

方法说明
void start()使该线程开始执行,注意不是立即执行,不是一般方法调用;Java 虚拟机调用该线程的 run 方法
void run()线程的执行体
void setName(String)改变线程名称
void setPriority(int)更改线程的优先级,Java中线程的优先级可以分为1-10,默认为5
void setDaemon(boolean)设置守护线程,守护线程是一种用于提供服务的线程,一般线程体中使用的是死循环,会在所有非守护线程退出后自动关闭
void join()/(long millisec)等待该线程终止的时间最长为 millis 毫秒
void interrupt()中断线程,不是中断线程的执行,而是修改中断参数
boolean isAlive()测试线程是否处于活动状态,活动状态就是线程已经启动且尚未终止。线程处于正在运行或准备开始运行的状态,就认为线程是“存活”的
static void yield()暂停当前正在执行的线程对象,并执行其他线程
static void sleep(long millisec)在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响
static Thread currentThread()返回对当前正在执行的线程对象的引用

java针对线程提供了10级优先,优先级越高则获取更多的运行机会

但是不同的操作系统不一定支持10级优先,所以设置优先级时可能会出现在java中的不同优先级映射到操作系统中相同的优先级上。在具体编程中如果需要使用优先级,建议把优先级的差距拉开

Thread类中定义了3个常量
public static final int MIN_PRIORITY = 1;最小优先级
public static final int NORM_PRIORITY = 5;默认优先级
public static final int MAX_PRIORITY = 10;最大优先级

package com.yan1;

public class Test4 {
	public static void main(String[] args) {
		Thread t1=new Thread(()->{//一般守护线程都会使用死循环,因为自动终止
			while(true) {
				System.out.println(Thread.currentThread());
			}
		});
		t1.setDaemon(true);//设置守护线程应该在start方法之前
		t1.start();
		System.out.println("Main...end");
	}
}
package com.yan1;
/*
 * void join()/(long millisec)等待该线程终止的时间最长为millis毫秒
 * 
 *  while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
 */
public class Test5 {
	static int res=0;
	public static void main(String[] args) {
		Thread[] th=new Thread[10];
		for(int i=1;i<=10;i++) {
			int begin=(i-1)*100+1;
			int end=i*100;
			th[i-1]=new Thread(()->{
//				begin++;//匿名内部类中使用外部的临时变量(不是属性),要求临时变量必须final,final可写可不写
				for(int k=begin;k<=end;k++) {
					res+=k;
					//可能休眠的时候,正好在+1之前停止,可能会把+1给忘了
//					try {
//						Thread.sleep(5);
//					} catch (InterruptedException e) {
//						e.printStackTrace();
//					}
				}
			});
			th[i-1].start();
		}
		for(Thread tmp:th) {
			if(tmp!=null) {
				try {
//					tmp.join();//无限制等待,直到出现异常或者等待的对象tmp执行结束
					tmp.join(0);//0表示无限制等待,等价于无参数
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
		System.out.println(res);
	}
}
package com.yan1;
/*
 * void interrupt()中断线程,不是中断线程的执行,而是修改中断参数
 * 
 * 具体实现依赖于调用interrupt方法后产生InterruptException实现的
 */
public class Test6 {
	public static void main(String[] args) {
		Thread t1=new Thread(()->{
			while(true) {
				System.out.println(Thread.currentThread());
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					break;
				}
			}
		});
		t1.start();
		t1.interrupt();
		System.out.println("Main......end");
	}
}
package com.yan1;

/*
 * boolean isAlive()测试线程是否处于活动状态,活动状态就是线程以及启动
 * 且尚未终止。线程处于正在运行或准备开始运行的状态,就认为线程是"存活"的
 */
public class Test7 {
	public static void main(String[] args) {
		Thread t1=new Thread(()->{
			System.out.println(Thread.currentThread());
		});
		t1.start();
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(t1.isAlive());
		System.out.println(t1);//Thread[Thread-0,5,]线程组main不要了,已经执行完了
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值