Java 多线程举例
进程和多线程是两个基本的执行单元
Java线程示例
每个应用程序至少有一个线程-主线程。main 是一个Java线程,可以从中创建多个线程。
Java线程的好处
- 与进程相比,Java Thread是轻量级的,创建线程需要的时间和资源更少。
- 线程共享父进程数据和代码
- 线程之间的上下文切换比进程之间的切换代价更少
- 线程互通比进程互通更快
Java提供了两种方式传感线程
- java.lang.Runnable
- java.lang,Thread
Java 线程示例,实现Runnable接口
为了使得类可以运行,可以实现 java.lang.Runnable接口并在public void run()方法中提供实现。
若要将此类用作Thread,需要通过传递Runnable对象来创建Thread对象,然后调用start() 方法来运行
Java线程示例,继承Thread 类
我们可以扩展 java.lang.Thead类来创建自己的java线程类和覆盖run()方法。然后通过创建它的对象和调用start()方法来执行定义的java类的run方法
Runnable vs Thread
如果类提供更多功能而不是仅仅作为Thread运行,则应该使用Runnable,如果类的目的单一的使用Thread运行,则可以直接使用Thread类。
实现Runnable是首先,Java支持实现多个接口,如果扩展Thread类,不能扩展其他类。
ExtendingThreadClass.java
package coreofjava.javathread.javarunnable;
/**
* Thread 实现 线程
*
* from https://www.journaldev.com/1016/java-thread-example
*/
public class ExtendingThreadClass extends Thread {
public ExtendingThreadClass(String name) {
super(name);
}
public void run() {
System.out.println("Extending Thread Class - Start" + Thread.currentThread().getName());
try {
Thread.sleep(1000);
doDBProcessing();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Extending Thread Class End" + Thread.currentThread().getName());
}
private void doDBProcessing() throws InterruptedException {
Thread.sleep(5000);
}
}
RunnableTest.java
package coreofjava.javathread.javarunnable;
/**
* 通过Runnable实现线程
*
* from https://www.journaldev.com/1016/java-thread-example
*/
public class RunnableTest implements Runnable {
@Override
public void run() {
System.out.println("线程 - 开始 " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
System.out.println("进行一些处理");
doDBProcessing();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程 - 结束 " + Thread.currentThread().getName());
}
public void doDBProcessing() throws InterruptedException {
Thread.sleep(5000);
}
}
Test.java
package coreofjava.javathread.javarunnable;
public class Test {
public static void main(String[] args) {
ExtendingThreadClass etc1 = new ExtendingThreadClass("T1");
ExtendingThreadClass etc2 = new ExtendingThreadClass("T2");
System.out.println("开始执行 Thread");
etc1.start();
etc2.start();
System.out.println("Thread 已经开始执行");
Thread t1 = new Thread(new RunnableTest(), "T3");
Thread t2 = new Thread(new RunnableTest(), "T4");
System.out.println("开始 Runnable");
t1.run();
t2.run();
System.out.println("Runnable Start");
}
}