进程:进程指正在运行的程序。当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
线程:是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个线程中是可以有多个线程的,这个应用程序也可以被称为多线程程序。
一个程序运行后至少有一个进程,一个进程中可以包含多个线程
举例:
单线程程序:即,若有多个任务只能依次执行。当上一个任务执行结束后,下一个任务开始执行。
如,去网吧上网,网吧只能让一个人上网,当这个人下机后,下一个人才能上网。
多线程程序:即,若有多个任务可以同时执行。如,去网吧上网,网吧能够让多个人同时上网。
程序运行原理
分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
主线程
代码演示:
class Demo{ String name; Demo(String name){ this.name = name; } void show() { for (int i=1;i<=10000 ;i++ ) { System.out.println("name="+name+",i="+i); } } } class ThreadDemo { public static void main(String[] args) { Demo d = new Demo("小强"); Demo d2 = new Demo("旺财"); d.show(); d2.show(); System.out.println("Hello World!"); } }
jvm启动后,必然有一个执行路径(线程)从main方法开始的,一直执行到main方法结束,这个线程在java中称之为主线程。
Thread类
构造方法:
常用方法:
创建线程方式一继承Thread类
代码演示:
public class MyThread extends Thread{ MyThread(){ } public MyThread(String name){ super(name); } public void run() { System.out.println(super.getName()); /*for(int j=0;j<10;j++){ System.out.println("run....."+j); }*/ } } 测试类: public class Demo01 { // "main"主线程 public static void main(String[] args) { //获取当前执行该方法的线程对象 Thread m=Thread.currentThread(); //获取线程对象的名称 System.out.println(m.getName()); //System.out.println(0/0); //新建一个线程 MyThread th=new MyThread("蔡文奶"); //th.setName("蔡文奶"); //开启线程 th.start(); /*for(int i=0;i<10;i++){ System.out.println("main..."+i); }*/ } }
线程对象调用 run方法和调用start方法区别?
线程对象调用run方法不开启线程。仅是对象调用方法。线程对象调用start开启线程,并让jvm调用run方法在开启的线程中执行。
多线程图解:
获取线程名称
代码演示:
class MyThread extends Thread { //继承Thread MyThread(String name){ super(name); } //复写其中的run方法 public void run(){ for (int i=1;i<=20 ;i++ ){ System.out.println(Thread.currentThread().getName()+",i="+i); } } } class ThreadDemo { public static void main(String[] args) { //创建两个线程任务 MyThread d = new MyThread(); MyThread d2 = new MyThread(); d.run();//没有开启新线程, 在主线程调用run方法 d2.start();//开启一个新线程,新线程调用run方法 } }
接口中的方法:
Thread类构造方法
代码演示:
public class Demo02 { public static void main(String[] args) { //创建线程执行目标类对象 Runnable runn = new MyRunnable(); //将Runnable接口的子类对象作为参数传递给Thread类的构造函数 Thread thread = new Thread(runn); Thread thread2 = new Thread(runn); //开启线程 thread.start(); thread2.start(); for (int i = 0; i < 10; i++) { System.out.println("main线程:正在执行!"+i); } } } 自定义线程执行任务类 public class MyRunnable implements Runnable{ //定义线程要执行的run方法逻辑 @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("我的线程:正在执行!"+i); } } }
线程的匿名内部类使用
方法一:
public class Demo01 { public static void main(String[] args) { //匿名内部类 new Thread(){ public void run() { for(int i=0;i<50;i++){ System.out.println("run..."+i); } } }.start(); } }
方式2:使用匿名内部类的方式实现Runnable接口,重新Runnable接口中的run方法
public class Demo02 { public static void main(String[] args) { Runnable run=new Runnable(){ public void run() { for(int i=0;i<50;i++){ System.out.println("run..."+i); } } }; Thread th=new Thread(run); th.start(); //简化 new Thread(new Runnable(){ public void run() { for(int i=0;i<50;i++){ System.out.println("run..."+i); } } }).start(); } }