多线程的运行和APi介绍
多线程
1.使用多线程
1.1继承Thread类
public class MyThread extends Thread{
public void run(){
}
}
启动线程是使用:
new MyThread.start();
1.2实现Runnable接口
public class MyThread implements Runnable {
public void run(){
}
}
启动线程是使用:
new Thread(new MyThread).start();
1.3实现Callable接口
public class MyThread implements Callable {
//重写call方法
public boolean call(){
return true;
}
public static void main(String[] arg){
MyThread mythread =new Mythread();
//创建执行服务,创建了3个服务线程
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> result=ser.submit(mythread);
//获取结果
boolean r1=result.get();
//关闭服务
ser.shutdownNow();
}
}
1.4Lamda表达式
1.前提是接口是函数式接口(接口里面只能有一个方法)。
2.Lamda表达式只能有一行代码的情况下才能简化成一行,如果有多行必须用代码块包裹着。
3.如果有多个参数,要简化参数,就去掉所有的参数。
new Thread(new MyThread).start();
new Thread(()->{System.out.println("Lamda表达式");}).start();
public class MyLamda{
public static void main(String[] arg){
//普通写
LamdaInterFace lamda=new LamdaInterFace(){
public void love(int a){
System.out.println("实现LamdaInterFace接口的love方法"+a);
}
};
//Lamda简化
LamdaInterFace lamda=(int a)->{
System.out.println("实现LamdaInterFace接口的love方法"+a);
};
//Lamda简化1:参数类型
LamdaInterFace lamda=(a)->{
System.out.println("实现LamdaInterFace接口的love方法"+a);
};
//Lamda简化2:括号
LamdaInterFace lamda=a->{
System.out.println("实现LamdaInterFace接口的love方法"+a);
};
//Lamda简化3:花括号
LamdaInterFace lamda=a-> System.out.println("实现LamdaInterFace接口的love方法"+a);
}
}
interface LamdaInterFace{
void love(int a);
}
2. 多线程API
2.1 CurrentThread()方法
可返回代码块正在被那个线程调用
eg: Thread.currentThread().getName();
2.2 isAlive方法
判断当前线程是否存活
2.3 sleep()系列方法
sleep (long millis)
让该线程在指定的毫秒内,线程体眠,暂停
sleep(long millis,int nanos)
让该线程在指定的毫秒加上指定的纳秒内,线程体眠,暂停
2.4 StackTraceElement[] getStackTrace() 方法
返回一个表示该线程堆栈跟踪元素的数组
如果线程为启动或已终止,返回一个零长度的数组
如果返回的数组不是零长度的,则其第一个元素代表堆栈顶(最新的方法调用),最后一个元素表示堆栈底(最旧的方法调用)
2.5 static void dumpStack() 方法
将当前线程的堆栈跟踪信息输出至标准错误流,该方法仅用于调试。
2.6 getId()方法
取得线程的唯一标识
2.7 停止线程
使用退出标志终止线程(布尔值)
使用stop()方法强制终止线程(方法已被弃用),suspend()和resume()都是过期方法
使用interrupt()方法制终止线程
2.8 暂停线程
suspend()方法暂停线程
resume()方法恢复线程
缺点:可能会导致线程独占,数据不完整
建议使用wait(),notify(),notifyAll()方法
2.9 yieId()方法
放弃当前的cpu资源,让其他任务去占用CPU执行时间,放弃的时间不确定,可能刚刚放弃就马上获取CPU时间片
2.10 线程的优先级
使用**setPriority()**方法可以设置线程的优先级(1-10)
线程的优先级可继承:A线程里启动B线程,B线程的优先级和A线程的优先级是一样的
线程的优先级的随机性:不一定优先级高的就一定先运行
线程的优先级越高,运行速度就越快
2.11 守护线程
使用**setDaemon(true)**设置守护线程
java线程分两种:一种用户线程,非守护线程,一种守护线程
主线程main是用户线程
当用户线程销毁了,守护线程也随之销毁
备注
- println()方法在内部是同步的。
- 执行run()方法和start()方法是有区别的
- 执行my.run()方法,主线程main立即执行,不会产生新的线程
- 执行my.start()方法,执行run()方法的时间不确定,会产生新的线程