1 多线程的概述
1.1 进程
- 就是正在运行的程序。是系统进行资源分配和调度的独立单位。每一个进程都有其自己的内存空间和系统资源。
1.2 多进程的意义?
- 单进程的计算机只能做一件事情,而我们现在的计算机可以做多件事情。例如:一边玩游戏,一边听音乐。
- 现在的计算机都支持多进程的,就可以一个时间段内执行多个任务,并且可以提高CPU的使用率。
1.3 线程
- 在一个进程内又可以执行多个任务,而这每一个任务我们就可以看成是一个线程。
- 线程是进程的执行单元(执行路径)。
- 单线程:如果程序有一条执行路径。
- 多线程:如果程序有多条执行路径。
1.4 多线程的意义?
- 多线程的存在,不是提高程序的执行速度。其实是为了提高应用程序的使用率。
- 程序的执行其实都是在抢CPU的资源,即CPU的执行权。
- 多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多的话,就有更高的几率抢到CPU的执行权。
- 线程的执行具有随机性。
1.5 Java程序的运行原理
- Java命令会启动Java虚拟机,启动JVM,等于启动了一个进程。 该进程会自动启动一个主线程,然后由主线程去调用某个类的main方法,所以main方法运行在主线程中的。
- JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。
2 多线程的实现方案
2.1 多线程的实现方案一
- 步骤:
- ①创建一个类去继承Thread类。
- ②该子类去重写run()方法。
- ③创建该子类的对象。
- ④启动线程
- 示例:
package com.xuweiwei; /** * 多线程的实现: * 由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。 * 而进程是由系统创建的,所以,我们应该去调用系统功能去创建一个进程。 * Java是不能直接带哦用系统功能的,所以,我们没有办法直接实现多线程程序。 * 但是,Java是可以调用C或C++写好的程序去实现多线程程序。 * 由C或C++去调用系统功能创建进程,然后由Java去调用这样的东西,然后提供一些API供我们使用。这样,我们就可以实现多线程程序了。 */ public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"= " + i); } } }
package com.xuweiwei; public class MyThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread(); t1.start(); MyThread t2 = new MyThread(); t2.start(); } }
2.2 获取线程对象的名称和设置线程对象的名称
- 方法:返回该线程的名称
public final String getName()
- 方法:设置线程的名称
public final void setName(String name)
- 方法:返回当前正在执行的线程对象的引用
public static Thread currentThread()
- 示例:无参构造方法+setName
package com.xuweiwei; public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"= " + i); } } }
package com.xuweiwei; public class MyThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); //设置线程的名字 t1.setName("t1"); t2.setName("t2"); t1.start(); t2.start(); } }
- 示例:有参构造方法
package com.xuweiwei; public class MyThread extends Thread { public MyThread() { } public MyThread(String name) { super(name); } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"= " + i); } } }
package com.xuweiwei; public class MyThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread("t1"); MyThread t2 = new MyThread("t2"); t1.start(); t2.start(); } }
- 示例:获取main方法所在的线程对象的名称
package com.xuweiwei; public class MyThreadTest { public static void main(String[] args) { System.out.println(Thread.currentThread().getName()); } }
2.3 线程的控制
- 方法:线程睡眠
public static void sleep(long millis) throws InterruptedException
- 方法:join线程,等待该线程终止
public final void join() throws InterruptedException
- 方法:线程礼让即暂停当前的正在执行的线程对象,并执行其他线程。
public static void yield()
- 方法:守护线程
public final void setDaemon(boolean on)
- 方法:中断线程
public void interrupt()
- 示例:
package com.xuweiwei; public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"= " + i); } } }
- 示例:
package com.xuweiwei; public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "= " + i); } } }
package com.xuweiwei; public class MyThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); MyThread t3 = new MyThread(); t1.setName("李渊"); t2.setName("李建成"); t3.setName("李世民"); t1.start(); try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } t2.start(); t3.start(); } }
- 示例:
package com.xuweiwei; public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "= " + i); Thread.yield(); } } }
package com.xuweiwei; public class MyThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); MyThread t3 = new MyThread(); t1.setName("李渊"); t2.setName("李建成"); t3.setName("李世民"); t1.start(); t2.start(); t3.start(); } }
- 示例:
package com.xuweiwei; public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "= " + i); Thread.yield(); } } }
package com.xuweiwei; public class MyThreadTest { public static void main(String[] args) { MyThread t2 = new MyThread(); MyThread t3 = new MyThread(); t2.setName("李建成"); t3.setName("李世民"); t2.setDaemon(true); t3.setDaemon(true); t2.start(); t3.start(); Thread.currentThread().setName("李渊"); for (int i = 0; i < 3; i++) { System.out.println(Thread.currentThread().getName()+"= " + i); } } }
2.4 线程的生命周期
- 新建:创建线程对象。
- 就绪:有执行资格,但是没有执行权。
- 运行:有执行资格,有执行权。
- 阻塞:由于一些操作,让线程处于该状态。没有执行资格,没有执行权。
- 死亡:线程对象对象变成垃圾,等待被回收。
2.5 多线程的实现方式二
- 步骤:
- ①
3 线程调度和线程控制
4 线程生命周期
5 死锁
6 线程间通信
7 定时器的使用
原文地址:https://www.cnblogs.com/xuweiweiwoaini/p/9410609.html
时间: 2024-10-13 17:27:48