JAVA - 多线程 - 基础

多进程与多线程

1. 多进程:

  进程是程序的一次动态执行过程,是代码加载,代码执行和代码执行完成的一个完整的过程。多进程是操作系统级别的概念,它区分的是不同的正在被执行程序。由于CPU具备分时机制,每个进程都能循环的获得自己的CPU时间片,因为CPU执行速度非常快,使得用户觉得所有程序像在“同时”运行一样。

 

2. 多线程:

  线程是程序执行过程中最小的调度单位,是在进程的基础上进一步划分,是比进程更小的执行单位。多线程是程序执行基本的概念,它区分的是程序内部不同的执行单元。这些线程可以同时存在,同时运行,争取更多的CPU资源。多线程机制是指可以同时运行多个程序块,使程序运行的效率变得更高。

 

JAVA中线程的实现

   在JAVA中要想实现多线程程序有两种手段:1)继承Thread类;2)实现Runnable接口。在JAVA中,所有线程都是同时启动的,哪个线程先抢占到了CPU资源,哪个线程就先运行。

   由于JAVA的垃圾回收机制,其实每个JAVA程序运行时至少会启动两个线程,一个是main线程,另一个是垃圾收集线程。

继承Thread类

Thread类是在java.lang包中定义的。利用Thread类实现多线程的方法如下:

  1. 创建一个线程子类继承Thread类,并复写其run()方法,此方法是线程的主体;
  2. 实例化这个子类,调用start()方法,启动线程。

举个例子:

class MyThread extends Thread {
	private String name = null;
	public MyThread(String name) {
		this.name = name;
	}
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(name + "运行,i = " + i);
		}
	}
}
	
public class ThreadDemo01 {
	public static void main(String args[]) { 
		MyThread mt1 = new MyThread("线程 A - ");
		MyThread mt2 = new MyThread("线程 B - ");		
		mt1.start();
		mt2.start();
	}
}

 

程序运行的结果:线程A跟线程B交替着运行(可能的一种可能)

线程 A - 运行,i = 0
线程 B - 运行,i = 0
线程 B - 运行,i = 1
线程 B - 运行,i = 2
线程 A - 运行,i = 1
线程 B - 运行,i = 3
线程 A - 运行,i = 2
线程 B - 运行,i = 4
线程 A - 运行,i = 3
线程 B - 运行,i = 5
线程 A - 运行,i = 4
线程 B - 运行,i = 6
线程 A - 运行,i = 5
线程 B - 运行,i = 7
线程 A - 运行,i = 6
线程 B - 运行,i = 8
线程 B - 运行,i = 9
线程 A - 运行,i = 7
线程 A - 运行,i = 8
线程 A - 运行,i = 9

实现Runnable接口

Runnable是一个接口,里面定义个一个抽象方法run()。利用Runnable接口实现多线程的方法如下:

  1. 创建一个类实现Runnable接口,并复写其中的run()方法,此方法是线程的主体;
  2. 实例化实现Runnable接口的对象,作为参数传递到Thread的构造方法中,实例化Thread类;
  3. 调用Thread类的start()方法启动线程。

举个例子:

class MyThread implements Runnable {
	private String name = null;
	public MyThread(String name) {
		this.name = name;
	}
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(name + "运行,i = " + i);
		}
	}		
}

public class ThreadDemo02 {
	public static void main(String[] args) {
		MyThread mt1 = new MyThread("线程 A - ");
		MyThread mt2 = new MyThread("线程 B - ");
		Thread t1 = new Thread(mt1);
		Thread t2 = new Thread(mt2);
		t1.start();
		t2.start();
	}
}

 

程序运行的结果:线程A跟线程B交替着运行(可能的一种可能)

线程 A - 运行,i = 0
线程 B - 运行,i = 0
线程 B - 运行,i = 1
线程 B - 运行,i = 2
线程 B - 运行,i = 3
线程 B - 运行,i = 4
线程 B - 运行,i = 5
线程 B - 运行,i = 6
线程 B - 运行,i = 7
线程 B - 运行,i = 8
线程 B - 运行,i = 9
线程 A - 运行,i = 1
线程 A - 运行,i = 2
线程 A - 运行,i = 3
线程 A - 运行,i = 4
线程 A - 运行,i = 5
线程 A - 运行,i = 6
线程 A - 运行,i = 7
线程 A - 运行,i = 8
线程 A - 运行,i = 9

 

Thread类与Runnable接口

虽然Thread类和Runnable接口都可以实现多线程,但是开发中建议使用Runnable接口,原因是Runnable接口具有以下优势:

  1. Thread类是需要继承的,其必定会收到JAVA单继承的限制,而Runable接口则不受此限制,JAVA允许实现多个接口;
  2. Runnable接口中的线程主体代码能够被多个线程共享,实现资源的共享。

 

线程的状态

任何线程都具有5种状态,即创建,就绪,运行,阻塞,终止。线程状态之间的转移可以用下图表示:

 

 

1.  创建状态

      在程序中用构造方法创建一个线程对象后,新的线程对象就处于创建状态。此时,它已经有了相应的内存空间,只是还没运行起来。

2.  就绪状态

      新建线程后,调用Thread类的start()方法就可以启动线程。当线程启动时,线程进入就绪状态,进入线程队列中排队,等待CPU的时间片。

3.  运行状态

      当就绪状态的线程获得CPU调度后,线程就进入运行状态。此时,会自动执行线程对象run()方法中的代码。

4.  堵塞状态

       一个正在执行的线程在某些特殊条件下,如认为挂起或者IO耗时操作,会让出CPU中止自己的执行,进入堵塞状态。如果调用sleep(),suspend(),wait()等方法,线程也会进入堵塞状态。堵塞时,线程是不能进入排队队列的,只有当引起嘚瑟的原因被消除后,线程才可以进入就绪状态,等待CPU的重新调度。

5.  死亡状态

      线程调用stop()方法时或者run()方法执行结束后,即进入死亡状态。处于死亡状态的线程是不具有继续运行的能力的。

 

线程操作的相关方法

Thread类的常用方法
序号方法名称类型作用描述
1public Thread(Runnable target)构造接收Runnable接口子类对象,实例化Thread对象
2public Thread(Runnable target,String name)构造接收Runnable接口子类对象,实例化Thread对象,并设置线程名称
3public Thread(String name)构造实例化Thread对象,并设置线程名称
4public static Thread currentThread()普通返回目前正在执行的线程
5public final String getName()普通返回线程的名称
6public final getPriority()普通返回线程的优先级
7public boolean isInterrupted()普通判断目前线程是否可被打断
8public final boolean isAlive()普通判断线程是否在活动
9public final void join() throws InterruptedException普通等待线程死亡
10public final synchronized void join(long millis) throws InterruptedException普通等待millis毫秒后,线程死亡
11public void run()普通线程主体方法
12public final void setName(String name)普通设定线程名称
13public final void setPriority(int newPriority)普通设定线程优先级
14public static void sleep(long millis) throws InterruptedException普通使目前正在执行的线程休眠millis毫秒
15public void start()普通开始执行线程
16public String toString()普通返回代表线程的字符串
17public static void yied()普通将目前正在执行的线程暂停,允许其他线程执行
18public final void setDaemon(boolean on)普通将一个线程设置成后台运行

 

 BR~

 Jianwei Wang



 

 



 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值