进程和线程是计算机中的两个基本的执行单元。java的并发程序更关注的是线程。
进程
进程可以看做是一个程序或者一个应用,是包含运行环境的。但是,一个运行的程序本身是可以包含多个进程。java运行环境可以被看做是一个运行着多个不同的类和程序的进程的进程。
线程
每个java应用至少包含一个线——main方法。尽管后台运行着很多其他的线程,比如说内存管理、系统管理、信号处理等。但是,从应用的角度看,main方法是第一个进程,我们也可以在main方法里面创建多线程。
多线程是指一个程序同时运行着两个或两个以上的线程。一台单核但闹每次只能运行一个线程,时间片是用来实现不同的进程和线程之间相互切换的。
线程的优点
1.相对于进程,线程更加轻量级。线程比进程消耗更少的时间和资源。
2.线程可以共享福进程的数据和代码。
3.线程之间的上下文切换通常比进程之间的相互切换要节省。
4.线程之间的相互通信比进程之间的相互通信要简单方便得多。
java提供了两种创建线程的实现方式。
1.实现 java.lang.Runnable接口
2.继承java.lang.Thread类。
实现Runnable的java线程例子
为了让类编程runnable的,我们实现 java.lang.Runnable接口,这个接口提供了一个空返回的run()方法。为了刻个把类当做线程,我们需要通过运行这个类来创建一个Thread对象,然后调用start()方法在不同的线程中运行run()方法。
这里是一个简单的例子,旨在说明如何实现runnable接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package com.journaldev.threads;
public class HeavyWorkRunnable implements Runnable {
@Override
public void run() {
System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
try {
Thread.sleep(1000);
//Get database connection, delete unused data from DB
doDBProcessing();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
}
private void doDBProcessing() throws InterruptedException {
Thread.sleep(5000);
}
|
|
我们通过继承java.lang.Thread类,重写run()方法创建我们自己的线程类。然后我们可以创建它的对象吗,再调用start()方法来运行自定义run()方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package
com.journaldev.threads;
public
class
MyThread
extends
Thread {
public
MyThread(String name) {
super
(name);
}
@Override
public
void
run() {
System.out.println(
"MyThread - START "
+Thread.currentThread().getName());
try
{
Thread.sleep(
1000
);
//Get database connection, delete unused data from DB
doDBProcessing();
}
catch
(InterruptedException e) {
e.printStackTrace();
}
System.out.println(
"MyThread - END "
+Thread.currentThread().getName());
}
private
void
doDBProcessing()
throws
InterruptedException {
Thread.sleep(
5000
);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package
com.journaldev.threads;
public
class
ThreadRunExample {
public
static
void
main(String[] args){
Thread t1 =
new
Thread(
new
HeavyWorkRunnable(),
"t1"
);
Thread t2 =
new
Thread(
new
HeavyWorkRunnable(),
"t2"
);
System.out.println(
"Starting Runnable threads"
);
t1.start();
t2.start();
System.out.println(
"Runnable Threads has been started"
);
Thread t3 =
new
MyThread(
"t3"
);
Thread t4 =
new
MyThread(
"t4"
);
System.out.println(
"Starting MyThreads"
);
t3.start();
t4.start();
System.out.println(
"MyThreads has been started"
);
}
}
|
输出是:
Starting Runnable threads
Runnable Threads has been started
Doing heavy processing - START t1
Doing heavy processing - START t2
Starting MyThreads
MyThread - START Thread-0
MyThreads has been started
MyThread - START Thread-1
Doing heavy processing - END t2
MyThread - END Thread-1
MyThread - END Thread-0
Doing heavy processing - END t1