一、程序、进程、线程 程序 为了解决某个问题、实现某个功能用某种编程语言编写的代码文件,是静态的;(例如在本地未运行的各种应用程序QQ、微信等); 进程 当程序被运行,程序由静态变为动态,就会产生相应的进程,是动态的,有生命周期;(例如打开QQ程序,就会有QQ的进程);
public class Thread1 extends Thread{
@Override
public void run() {
System.out.println("新线程");
} }
Test类
public class Test { public static void main(String[] args) { // 1、定义子类继承Thread; // 2、子类中重写run() 方法; // 3、创建子类对象; Thread1 t1 = new Thread1(); // 4、调用start() 方法启用线程; t1.start(); } }
方式二:实现Runnable 步骤 1、定义子类实现Runnable; 2、子类中重写run()方法; 3、创建子类对象; 4、通过Thread含参构造方法创建Thread对象; 5、调用start()方法启用线程; 代码 Thread1类public class Thread1 implements Runnable{
@Override
public void run() {
System.out.println("新线程");
} }
Test类
public class Test { public static void main(String[] args) { // 1、定义子类实现Runnable; // 2、子类中重写run() 方法; // 3、创建子类对象; Thread1 thread1 = new Thread1(); // 4、通过Thread含参构造方法创建Thread对象; Thread thread = new Thread(thread1); // 5、调用start() 方法启用线程; thread.start(); } }
六、实现和继承对比 不同之处 1、继承只能单继承,而实现没有这一重限制; 2、实现时,多个线程可共享同一个接口实现类的对象; 相同之处 1、手动调用run()方法只是普通调用,并未启用多线程; 2、run()方法调用的一切控制由cpu决定; 3、要想启用多线程,必须调用start()方法; 4、一个线程只能调用一次start()方法,否则会报异常; 七、线程优先级 Java线程调度方法 同优先级线程组成先进先出队列(先到先服务),使用时间片策略; 对高优先级,使用优先调度的抢占式策略,抢占式即高优先级线程抢占CPU资源; 线程的优先级等级 MAX_PRIORITY: 10 MIN _PRIORITY: 1 NORM_PRIORITY: 5 涉及的方法 getPriority() : 返回线程优先值
setPriority(int newPriority) : 改变线程的优先级