做网站办公照片/汕头网页搜索排名提升

进程与线程
概述
- 进程
- 正在运行的程序
- 是系统进行资源分配和调用的独立单位
- 线程
- 是进程中的单个顺序控制流,是一条执行路径
- 单线程:一个进程如果一条执行路径,则称为单线程程序
- 多线程:一个进程如果有多条执行路径,则称为多线程程序
多线程的实现方式
- 方式1:继承Thread类
- 定义一个类MyThread继承Thread类
- 创建MyThread类的对象
- 启动线程
```java package duoxianchen;
public class MyThread extends Thread{ public MyThread() { }
public MyThread(String name) {super(name);}@Overridepublic void run() {for(int i=0;i<100;i++){System.out.println(getName()+":"+i);}}
} ```
- 测试类
```java package duoxianchen;
public class demo1 { public static void main(String[] args) { MyThread my1=new MyThread(); MyThread my2=new MyThread(); my1.start(); my2.start(); } } ```
- 为什么要重写run()方法
- 因为run()是用来封装被线程执行的代码
- run()方法和start()方法的区别
- run():封装线程执行的代码,直接调用,相当于普通方法的调用
- start():启动线程;然后用JVM调用此线程的run()方法
设置和获取线程名称
- void setName(String name):将此线程的名称更改为等于参数name
- String getName():返回此线程的名称
- 通过构造方法也可以设置线程名称
- 如何获取main()方法所在的线程名称
- public static Thread current Thread():返回对当前正在执行的线程对象的引用
```java public class demo1 { public static void main(String[] args) { // MyThread my1=new MyThread(); // MyThread my2=new MyThread(); //Thread(String name) MyThread my1=new MyThread("高铁"); MyThread my2=new MyThread("地铁");
my1.start();my2.start();}
} ```
线程调用
- 线程有两种调度模型
- 分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
- 抢占式调度模型:优先让优先级搞的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些
- java使用的是抢占式调度模型
- 假如计算机只有一个CPU,那么CPU在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令,所以说多线程程序的执行是由随机性,因为谁抢到CPU的使用权是不一定的
Thread类中设置的获取线程优先级的方法
- public final int getPriority():返回此线程的优先级
- public final void setPriority(int newPriority):更改此线程的优先级
java public class demo2 { public static void main(String[] args) { ThreadPriority tp1=new ThreadPriority(); ThreadPriority tp2=new ThreadPriority(); ThreadPriority tp3=new ThreadPriority(); tp1.setName("高铁"); tp2.setName("qiuyifan"); tp3.setName("fanfan"); //public final int getPriority():返回此线程的优先级 System.out.println(tp1.getPriority()); //public final void setPriority(int newPriority):更改此线程的优先级 //tp1.setPriority(1000);class IllegalArgumentException extends RuntimeException System.out.println(Thread.MAX_PRIORITY);//10 System.out.println(Thread.MIN_PRIORITY);//1 System.out.println(Thread.NORM_PRIORITY);//5 tp1.setPriority(5); tp2.setPriority(10); tp3.setPriority(1); tp1.start(); tp2.start(); tp3.start(); } }
- 线程默认优先级是5;线程优先级范围是1-10
- 线程优先级高仅仅表示线程获取的CPU时间片的几率高,但是要在次数比较多,或者多次运行后才看到你想要的结果
线程控制
- static void sleep(long millis):使当前正在执行的线程停留指定的毫秒数
- void join():等待这个线程死亡
- void setDaemo(boolean on):将此线程标记为守护线程,当运行的线程都是守护线程时,java虚拟机将退出
java public class demo3 { public static void main(String[] args) { //void join():等待这个线程死亡 ThreadJoin tj1=new ThreadJoin(); ThreadJoin tj2=new ThreadJoin(); ThreadJoin tj3=new ThreadJoin(); tj1.setName("qiuyifan"); tj2.setName("qiuqiuqiu"); tj3.setName("qiuqiqu"); tj1.start(); try { tj1.join(); } catch (InterruptedException e) { e.printStackTrace(); } tj2.start(); tj3.start(); } }
```java public class demo4 { public static void main(String[] args) { ThreadDaemon td1=new ThreadDaemon(); ThreadDaemon td2=new ThreadDaemon(); td1.setName("fanfan"); td2.setName("qiqiu"); //设置主线程为刘备 Thread.currentThread().setName("yiiy"); //设置守护线程 td1.setDaemon(true); td2.setDaemon(true); td1.start(); td2.start();
for(int i=0;i<10;i++){System.out.println(Thread.currentThread().getName()+":"+i);}}
} ```
- 任何一个守护线程都是JVM中所有非守护线程的保姆,只要当前JVM实例中尚存在任何一个守护线程没有借宿,守护线程就全部工作
java public class TreadSleep extends Thread{ @Override public void run() { for(int i=0;i<100;i++){ System.out.println(getName()+":"+i); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } }
java public class demo5 { public static void main(String[] args) { TreadSleep ts=new TreadSleep(); TreadSleep ts1=new TreadSleep(); ts.setName("qiuqqiu"); ts1.setName("fanafn"); ts.start(); ts1.start(); } }