做网站是百度包年快照,企业做网站的用途,网站源码程序修改,环球军事网83.多线程
什么是线程#xff1a; 线程右进程创建的#xff0c;是进程的一个实体 一个进程可以有多个线程
并发#xff1a;同一个时刻#xff0c;多个任务交替执行#xff0c;造成一种貌似同时的错觉
并行#xff1a;同一个时刻#xff0c;多个任务同时执行#x…83.多线程
什么是线程 线程右进程创建的是进程的一个实体 一个进程可以有多个线程
并发同一个时刻多个任务交替执行造成一种貌似同时的错觉
并行同一个时刻多个任务同时执行多核CPU可以实现。可能并发和并行同时存在
通过Java查询电脑的CPU个数
public class HelloJava {
public static void main(String[] args) {Runtime runtime Runtime.getRuntime();//获取当前电脑的cpu数量int cpuNums runtime.availableProcessors();System.out.println(当前电脑的cpu个数 cpuNums);}
}
线程基本使用
创建线程的两种方法 继承Thread类重写run方法 实现Runnable接口重写run方法
注意若主线程结束了但还有子线程在运行就不会导致整个线程关闭
为什么要用cat.start()而不是直接用cat.run()呢
run就是一个普通方法没有真正启动一个线程就会把run方法执行完毕才向下执行 相当于串行化执行
start才会真正的启动一个线程
(1)
public synchronized void start(){start0();
}
(2)
//start0()是本地方法是JVM调用底层是C/C实现
//真正达到多线程效果的是start(),而不是run()
private native void start0();
//start()调用start0()方法后该线程不一定会立马执行只是将线程变成了可运行状态。具体什么时候执行取决于CPU由CPU统一调度
通过Runnable接口实现线程
因为Java是单继承的在一个类可能已经继承了某个父类这时在用继承Thread方法来创建线程显然不可行
所以提供了另一个方式创建线程就是通过实现Runnable接口
Runnable没有start()方法怎么办呢
//创建一个Thread对象把dog对象(实现Runnable)放入Thread
Thread thread new Thread(dog);
thread.start();
//这里调用start()方法启动线程并带动run方法
//这里是因为底层使用了 代理模式逻辑如下
//线程代理类模拟了一个极简的Thread
class ThreadProxy implements Runnable{private Runnable target null;Overridepublic void run(){if(target ! null){target.run();//动态绑定}}public ThreadProxy(Runnable target){this.target target}public void start(){start0();}public void start0(){run();}
}
多线程案例
public class HelloJava {public static void main(String[] args) {T1 t1 new T1();T2 t2 new T2();Thread thread1 new Thread(t1);Thread thread2 new Thread(t2);thread1.start();thread2.start();}
}
class T1 implements Runnable{
int count 0;
Overridepublic void run() {while (true) {//每隔一秒输出“Hello World”10次System.out.println(hello world (count));try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if (count 10){break;}}}
}
class T2 implements Runnable{
int count 0;
Overridepublic void run() {while (true) {//每隔一秒输出“hi”五次System.out.println(hi (count));try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if (count 5){break;}}}
}
通知线程退出 当线程完成任务后会自动退出 还可以通过使用变量来控制run方法退出的方式停止线程即通知方式
//需求启动一个线程t要求在main线程中去停止线程t
public class HelloJava {public static void main(String[] args) throws InterruptedException {T t new T();t.start();//如果希望主线程控制t线程的终止必须可以修改loop//让t退出run方法从而终止t线程 -通知方式
//让主线程休眠10秒再通知t线程退出Thread.sleep(1000*10);t.setLoop(false);}
}
class T extends Thread{//设置一个控制变量private boolean loop true;int count 0;
Overridepublic void run() {while (loop) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(T 运行中...... (count));}}
public void setLoop(boolean loop) {this.loop loop;}
}
线程常用方法
1.setName 设置线程名称使之与参数 name 相同
2.getName 返回该线程的名称
3.start 使该下暗藏卡爱上执行Java虚拟机底层调用该线程的start0方法
4.run 调用线程对象run方法
5.setProiority 更改线程的优先级
6.getProiority 获取线程的优先级
7.sleep 在指定的毫秒数内让当前正在执行的线程休眠
8.interrupt 中断线程
interrupt中断线程但没有真正的结束线程所以一般用于中断正在休眠的线程