1 多线程相关概念
并发(Concurrent):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。
同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
并行(Parallel):当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。其实决定并行的因素不是CPU的数量,而是CPU的核心数量,比如一个CPU多个核也可以并行。
进程(Process):是正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说CPU(寄存器),IO,内存,网络资源等。同样一个程序,同一时刻被两次运行了,那么他们就是两个独立的进程。
线程(Thread):是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
进程与线程的区别:
线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;进程是系统资源分配的单位,线程是系统调度的单位。
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。
调度和切换:线程上下文切换比进程上下文切换要快得多。
2 多线程概念
多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理“。
3 多线程优缺点
优点:
(1) 用户界面可以在进行其它工作的同时CPU一直处于活动状态,可以让程序运行速度更快。
(2)占用大量处理时间的任务可以定期将处理器时间让给其它任务,可以提高CPU利用率。
使用实例演示多线程好处。
缺点:
(1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。
(2)对线程进行管理要求额外的 CPU开销,线程的使用会给系统带来上下文切换的额外负担。
(3)线程的死锁。即对共享资源加锁实现同步的过程中可能会死锁。
4 多线程实现方式
1,继承thread
public class Mythread1 extends Thread{
@Override
public void run(){
for (int i=0;i<100;i++){
System.out.println("执行听歌"+i);
}
}
}
public class Mythread2 extends Thread{
@Override
public void start(){
for (int j=0;j<100;j++){
System.out.println("执行游戏"+j);
}
}
}
public class Threadtext1 {
public static void main(String[] args) {
Mythread1 t1=new Mythread1();
Mythread2 t2=new Mythread2();
t1.start();
t2.start();
}
}
2 , 实现Runnable
public class MyRunnable1 implements Runnable{
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println("执行听歌"+i);
}
}
}
public class MyRunnable2 implements Runnable {
@Override
public void run() {
for (int j=0;j<100;j++){
System.out.println("执行游戏"+j);
}
}
}
public class Threadtext2 {
/**
* Runnable接口实现类实现多线程的步骤:
* 1.定义类实现Rdhnable接口:
* 2.重写run方法;
* 3.在main方法中实例化Runnable接口的实现类对象;
* 4.定义两个线程Thread类的对象,把Runnable接口的实现对象传入构造方法中;
* 10 5.线程类对象调用start方法,启动线程,自动执行Runnable接口的实现类中的run方法;
*/
public static void main(String[] args) {
MyRunnable1 r1=new MyRunnable1();
MyRunnable2 r2=new MyRunnable2();
//Runnable接口的实现实现多线程,必须借助Thread类才能实现
Thread t1=new Thread(r1);
Thread t2=new Thread(r2);
t1.start();
t2.start();
}
}