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 它们都是静态方法,不会释放资源锁