java线程的实现
1-线程的概述
电脑中运行的每一个程序都是由一个进程组成,其中每一个进程又是由一个或者多个线程组成,程序运行实际是线程的运行。
2-创建线程的步骤(方法一)
- 第一步:创建自己的线程类,必须继承Thread类
- 第二步:重写run()方法,在方法体中写好需要做的事情
- 第三步:创建线程类的对象
- 第四步:通过线程类的对象调用start()方法
package advanced.nine;
/**
* @author Object
* @description 我的第一个线程类
* @date 2020/9/13
*/
public class MyThread01 extends Thread{
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("第一个线程 "+i);
}
}
}
package advanced.nine;
import java.util.ArrayList;
/**
* @author Object
* @description 多线程
* @date 2020/9/13
*/
public class Demo01 {
public static void main(String[] args) {
MyThread01 myT1 = new MyThread01();
MyThread01 myT3 = new MyThread01();
MyThread02 myT2 = new MyThread02();
myT1.start();
myT2.start();
myT3.start();
}
}
3-设置和获取线程名
3.1-设置线程名方法
方法名 | 说明 |
---|---|
public void setName(String name) | 通过set方法设置线程名 |
public 线程类名(String name) | 通过构造方法设置线程名 |
Thread.currentThread().setName(String name); | 获取当前线程对象,设置线程名,通用方法,可以设置主方法 |
3.2-获取线程名方法
方法名 | 说明 |
---|---|
public String getName() | 获取线程名 |
Thread.currentThread().getName(String name); | 获取当前线程对象,通过当前对象获取线程名 |
package advanced.nine;
import java.util.ArrayList;
/**
* @author Object
* @description 多线程
* @date 2020/9/13
*/
public class Demo01 {
public static void main(String[] args) {
MyThread01 myT1 = new MyThread01();
//设置线程名方法
MyThread01 myT3 = new MyThread01("线程2");
MyThread02 myT2 = new MyThread02();
//设置线程名方法
myT1.setName("线程1");
//获取线程名方法
System.out.println(myT1.getName());
myT1.start();
myT2.start();
myT3.start();
//设置线程名方法
Thread.currentThread().setName("主方法");
for (int i = 0; i <10 ; i++) {
//获取线程名方法
System.out.println(Thread.currentThread().getName()+i);
}
}
}
3.3-线程调度
-
线程调度模型
-
分时调度模型:所有的线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间。
-
抢占调度模型:优先让优先级高的线程调度CPU,如果优先级相同,则随即选择一个线程来执行。注意:优先级高只是
抢占CPU的机会相对多一些。
-
-
Tread类中设置和获取线程优先级方法
方法名 说明 public final int getPriority()
获取线程优先级 public final void setPriority(int num)
设置线程优先级 package advanced.nine.nineone; /** * @author Object * @description 我的第一个线程类 * @date 2020/9/13 */ public class MyThread01 extends Thread{ public MyThread01(String 线程2) { super(线程2); } public MyThread01(){ } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(this.getName()+":"+i); } } } //========================= package advanced.nine.nineone; /** * @author Object * @description 多线程 * @date 2020/9/13 */ public class Demo01 { public static void main(String[] args) { MyThread01 myT1 = new MyThread01(); //设置线程名方法 myT1.setName("线程1"); //获取线程名优先级,不设置优先级,默认优先级为5 System.out.println(myT1.getPriority()); //设置线程优先级,最大优先级是10 myT1.setPriority(Thread.MAX_PRIORITY); //再次获取线程的优先级 System.out.println(myT1.getPriority()); Thread.currentThread().setName("主方法"); } }
3.4-线程的生命周期
- 新建:创建线程对象,通过start()方法进入就绪状态。
- 就绪:有资格抢占CPU的执行权(需要抢占CPU)
- 运行:有执行资格,并且有执行权(执行过程中可能会被其它线程抢走CPU的执行权,如果被抢走,则退回到就绪状态,如果遇到sleep等阻塞方法,也会失去执行权,当方法结束后,回到就绪状态)
- 死亡:线程运行结束,成为垃圾有JVM处理。
4-线程的实现方法(方法二)
- 第一步:定义自己的线程类 MyRunnable来实现Runnable接口
- 第二步:在 MyRunnable类中重写run方法
- 第三步:创建Tread类的对象,把MyRunnable类的对象作为构造方法的参数
- 第四步:启动线程
package advanced.nine.ninetwo;
import ten.Run;
/**
* @author Object(object_hui@sina.com)
* @description Runnable类实现线程示例
* @date 2020/9/13
*/
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" : "+i);
}
}
}
//======================================
package advanced.nine.ninetwo;
/**
* @author Object(object_hui@sina.com)
* @description Runnable实现线程测试类
* @date 2020/9/13
*/
public class Demo03 {
public static void main(String[] args) {
//创建实现了Runnable接口的对象
MyRunnable mr = new MyRunnable();
//创建线程对象,将接口对象作为参数传进构造方法
Thread th = new Thread(mr,"郭得刚");
//启动线程
th.start();
}
}