JAVA - 多线程 - 基础
2015-10-19 09:25
381 查看
多进程与多线程
1. 多进程:进程是程序的一次动态执行过程,是代码加载,代码执行和代码执行完成的一个完整的过程。多进程是操作系统级别的概念,它区分的是不同的正在被执行程序。由于CPU具备分时机制,每个进程都能循环的获得自己的CPU时间片,因为CPU执行速度非常快,使得用户觉得所有程序像在“同时”运行一样。
2. 多线程:
线程是程序执行过程中最小的调度单位,是在进程的基础上进一步划分,是比进程更小的执行单位。多线程是程序执行基本的概念,它区分的是程序内部不同的执行单元。这些线程可以同时存在,同时运行,争取更多的CPU资源。多线程机制是指可以同时运行多个程序块,使程序运行的效率变得更高。
JAVA中线程的实现
在JAVA中要想实现多线程程序有两种手段:1)继承Thread类;2)实现Runnable接口。在JAVA中,所有线程都是同时启动的,哪个线程先抢占到了CPU资源,哪个线程就先运行。由于JAVA的垃圾回收机制,其实每个JAVA程序运行时至少会启动两个线程,一个是main线程,另一个是垃圾收集线程。
继承Thread类
Thread类是在java.lang包中定义的。利用Thread类实现多线程的方法如下:创建一个线程子类继承Thread类,并复写其run()方法,此方法是线程的主体;
实例化这个子类,调用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接口实现多线程的方法如下:创建一个类实现Runnable接口,并复写其中的run()方法,此方法是线程的主体;
实例化实现Runnable接口的对象,作为参数传递到Thread的构造方法中,实例化Thread类;
调用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接口具有以下优势:Thread类是需要继承的,其必定会收到JAVA单继承的限制,而Runable接口则不受此限制,JAVA允许实现多个接口;
Runnable接口中的线程主体代码能够被多个线程共享,实现资源的共享。
线程的状态
任何线程都具有5种状态,即创建,就绪,运行,阻塞,终止。线程状态之间的转移可以用下图表示:1. 创建状态
在程序中用构造方法创建一个线程对象后,新的线程对象就处于创建状态。此时,它已经有了相应的内存空间,只是还没运行起来。
2. 就绪状态
新建线程后,调用Thread类的start()方法就可以启动线程。当线程启动时,线程进入就绪状态,进入线程队列中排队,等待CPU的时间片。
3. 运行状态
当就绪状态的线程获得CPU调度后,线程就进入运行状态。此时,会自动执行线程对象run()方法中的代码。
4. 堵塞状态
一个正在执行的线程在某些特殊条件下,如认为挂起或者IO耗时操作,会让出CPU中止自己的执行,进入堵塞状态。如果调用sleep(),suspend(),wait()等方法,线程也会进入堵塞状态。堵塞时,线程是不能进入排队队列的,只有当引起嘚瑟的原因被消除后,线程才可以进入就绪状态,等待CPU的重新调度。
5. 死亡状态
线程调用stop()方法时或者run()方法执行结束后,即进入死亡状态。处于死亡状态的线程是不具有继续运行的能力的。
线程操作的相关方法
序号 | 方法名称 | 类型 | 作用描述 |
---|---|---|---|
1 | public Thread(Runnable target) | 构造 | 接收Runnable接口子类对象,实例化Thread对象 |
2 | public Thread(Runnable target,String name) | 构造 | 接收Runnable接口子类对象,实例化Thread对象,并设置线程名称 |
3 | public Thread(String name) | 构造 | 实例化Thread对象,并设置线程名称 |
4 | public static Thread currentThread() | 普通 | 返回目前正在执行的线程 |
5 | public final String getName() | 普通 | 返回线程的名称 |
6 | public final getPriority() | 普通 | 返回线程的优先级 |
7 | public boolean isInterrupted() | 普通 | 判断目前线程是否可被打断 |
8 | public final boolean isAlive() | 普通 | 判断线程是否在活动 |
9 | public final void join() throws InterruptedException | 普通 | 等待线程死亡 |
10 | public final synchronized void join(long millis) throws InterruptedException | 普通 | 等待millis毫秒后,线程死亡 |
11 | public void run() | 普通 | 线程主体方法 |
12 | public final void setName(String name) | 普通 | 设定线程名称 |
13 | public final void setPriority(int newPriority) | 普通 | 设定线程优先级 |
14 | public static void sleep(long millis) throws InterruptedException | 普通 | 使目前正在执行的线程休眠millis毫秒 |
15 | public void start() | 普通 | 开始执行线程 |
16 | public String toString() | 普通 | 返回代表线程的字符串 |
17 | public static void yied() | 普通 | 将目前正在执行的线程暂停,允许其他线程执行 |
18 | public final void setDaemon(boolean on) | 普通 | 将一个线程设置成后台运行 |
BR~
Jianwei Wang
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树