一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
-
多线程怎么说那就好比你一边听歌,一边烧水,一边敲代码时间充分利用起来了。
-
多线程的实现是CPU支持的它会保留每个线程的信息例如寄存器的信息代码执行位置等,然后进行切换执行,对于用户来说是无感的。
1.多线程的实现方式
1.1继承 Thread
public class HelloThread extends Thread{
@Override
public void run() {
System.out.println("thread");
}
public static void main(String[] args) {
Thread th=new HelloThread();
th.start();
}
}
1.2.实现接口 Runnable
public class HelloThreadImp implements Runnable{
@Override
public void run() {
System.out.println("rannable");
}
public static void main(String[] args) {
Runnable hti=new HelloThreadImp();
Thread t=new Thread(hti);
t.start();
}
}
1.3.实现接口 Callable 结合FutureTask 带返回值的
public class HellloThreadCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "threadCallable";
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
HellloThreadCallable htc=new HellloThreadCallable();
FutureTask<String> ft=new FutureTask<String>(htc);
new Thread(ft).start();
String result=ft.get();
System.out.println(result);
}
}
2.停止线程的几种方式
2.1 return
2.2 向外抛异常
2.3 全局变量判断结合1,2
2.4 使用interrupt()中断线程
Thread.isInterrupted() //判断是否被中断
Thread.interrupted() //判断是否被中断,并清除当前中断状态 注意第二次调用返回false
//遇到Thread.sleep会报异常
public class ThreadInterrupt implements Runnable {
@Override
public void run() {
int i = 0;
while (true) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("线程终止");
return;
} else {
System.out.println(++i);
if (i % 10000 == 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
}
}
}
}
public static void main(String[] args) throws InterruptedException {
ThreadInterrupt ti = new ThreadInterrupt();
Thread t = new Thread(ti);
t.start();
Thread.sleep(200);
t.interrupt();
}
}
2.5 使用stop方法 已经被弃用了
2.6 直接系统退了
- java.lang.System.exit()
3.线程现有的一些方法
3.1设置优先级
//1-10 优先级高的不一定会先执行完,就是被执行的概率大
thred.setPriority(1);
3.2设置守护线程
//线程分为用户线程和守护线程,当所有的线程都是守护线程的时候 守护线程会自动销毁的,典型的守护线程是垃圾线程
//启动线程之前调用一个线程的setDaemon()方法
thred.setDaemon(true);
3.3判断线程是否存活
启动未终止
thred.isAlive();
4.sleep、yield区别
- yield放弃时间不确定,有可能立马又被CPU执行;而sleep会让线程阻塞指定的时间
- sleep方法不考虑线程优先级,yield方法只会给相同优先级或者更高优先级线程运行
- yield没有声明异常,sleep会被interrupted打断
- yield和sleep 它们都是静态方法,不会释放资源锁