源地址 http://www.journaldev.com/1016/java-thread-example 作者 Pankaj
欢迎来学习Java 线程的例子,进程和线程是两基本的单元被执行,相比较来说在并发程序中更多的是关注的JAVA线程。
进程
一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用,在一个程序中包含多个进程。JAVA运行环境中作为一个进程包含不同的类和程序流程。
线程
线程可以被叫做轻量级的进程,线程需要更少的资源来创建和存在在这个过程中,线程共享进程的资源。 每个java应用程序有至少一个线程-(main方法主线程),虽然在后台有很多其它java 线程运行例如内存管理,系统管理和单进程等,但是对于应用程序来说-主线程是第一个Java线程并且我们在其中可以创建多线程。多线程是指两个或多个线程同时执行在一个程序中,在单核处理器的计算机中一次只能执行一个线程,操作系统中存在一个“时间切片” 特性用于切分处理器时间在不同的进程和线程中。
Java线程的优势
1.Java线程是轻量级的相比进程来说,当创建一个线程是可以花费少的时间和资源。
2.线程共享它们父进程的数据和代码。
3.上下文切换中通常线程比进程代价更少。
4.线程的内部通讯中是相对容易的比进程通讯。
Java提供两种方式编写创建线程
1.实现 the java.lang.Runnable 接口.
确保这个类是可以运行的,我们可以实现java.lang.Runnable中的public void run()方法,为了使得类作为一个线程,我们需要创建一个线程对象,通过这个实例化的对象,然后调用start()方法为了来执行run()方法在一个单独的线程中。
这是一个 java thread 举例 通过实现 Runnable 接口.
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);
}
}
2.继承 the java.lang.Thread 类.
这是一个 java thread 举例说明了如何继承Thread类
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);
}
}
这是一个测试程序说明了如何创建一个java线程和如何执行它,
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");
}
}
以上java线程示例程序的输出是
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
一旦我们开始执行任何线程,它的执行取决于操作系统实现的时间切片和我们不能控制其执行,然而我们甚至可以设置线程的优先级,但它并不能保证高优先级的线程会被首先执行。