一、两者的关系
进程:应用程序的执行实例,有独立的内存空间和系统资源。
线程:CPU调度和分派的基本单位,进程中执行运算的最小单位,真正在CPU上执行的是线程。
二、创建线程的两种方式(都需要重写run()方法)
方法一:继承java.lang.Thread类
1.创建线程类继承Thread类
package com.yh.myThread; public class ThreadDemo extends Thread { private int num = 0; @Override public void run() { // TODO Auto-generated method stub System.out.println(num++); } }
2.测试类
package com.yh.myThread; public class Test { public static void main(String[] args) { ThreadDemo thread = new ThreadDemo(); thread.start(); } }
运行结果:0
方法二:是西安java.lang.Runnable接口
多个线程如果是通过同一个Runable对象构造的,那么会共享Runable对象的资源。
1.创建线程类实现Runnable接口,并重写run()方法;
package com.yh.myThread; public class RunnableDemo implements Runnable { private int num = 0; @Override public void run() { // TODO Auto-generated method stub System.out.print(num++); } }
2.测试类
创建两个线程类对象,但是用同一个Runnable类对象
package com.yh.myThread; public class Test { public static void main(String[] args) { RunnableDemo runnable = new RunnableDemo(); Thread thread1 = new Thread(runnable); thread1.start(); Thread thread2 = new Thread(runnable); thread2.start(); } }
运行结果:0 1,注:顺序可能不同
3.两种方法的区别
a.通过实现接口的方式可以再继承别的类;
b.创建对象方式不同,使用实现Runnable接口方法,不同的线程对象使用同一个Runnable对象可以共享数据。
三、线程的状态
新生状态、可运行状态、阻塞状态、死亡状态
四、线程的调度
1.优先级:反应线程的重要或紧急程度,通过1-10表示,10的优先级最高,默认值是5。
更改优先级:myThread.setPriority(3);
2.线程调度的方法
join():将指定线程加入到当前线程
代码示例:
package com.yh.myThread; public class RunnableDemo implements Runnable { private int num = 0; ThreadDemo thread = new ThreadDemo(); @Override public void run() { // TODO Auto-generated method stub while(num<10) { if(num==4) { thread.start(); try { thread.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.print(num+++" "); } } }
运行结果:0 1 2 3 a b c d e 4 5 6 7 8 9
Thread.sleep():将当前线程阻塞指定的毫秒数
Thread.yield():暂停当前正在执行的线程,把执行机会让给相同或更高优先级的线程
五、线程同步
当两个或多个线程需要访问同一资源时,需要确保该资源某一时刻只能被一个线程使用。
通过同步代码块或代码实现,使用关键字synchronized。