多线程 (Thread)
什么是线程?
要讲线程,首先我门要知道进程的概念。那么什么是进程呢?进程实际上就是一个个正在运行的程序,一般来说,一个程序只有一个进程。而线程是进程中的一个个独立的小单元,一个进程可以拥有多个线程。比如我们以前写的程序,只有一个 main 方法,当程序运行时 main 方法就是这个程序的一个线程。但是里面其实还有一个隐藏的线程——GC线程。我们知道,方法需要压栈后才能被执行,在上一个方法被执行的时候是不能执行下一个方法的。如果我们想要让两个 方法同时执行,我们就要用到多线程了。
多线程
多线程是指一个程序中包含多个执行流。说到多线程,就不得不说一下并行和并发了。
那么什么时并行,什么是并发呢?
并行就是指多个进程在同时执行。
并发就是某一段时间中,一次只执行一个进程,但是有多个进程交替执行。就是一个进程执行一定时间后就执行另一个进程。并发时,在没有程序员干涉的情况下,进程的执行顺序由CPU来决定,CPU说谁先执行,谁就先执行,我们是无法更改的。
那么到底是怎么实现并发的呢?
我们都知道,方法的执行需要开辟栈帧,因此,想要实现多个方法的并发,就需要开辟新的栈帧。Java中,有两种方式可以实现多线程,一种是继承 Thread 类,另一种是实现 Runnable接口。这两种方式都需要对其中的run()
方法重写,再通过start()
方法来启动线程。但是 Runnable 接口中并没有satat()
方法,因此我们就需要借助 Thread 来实现。
示例
ThreadTest.java
package com.why.thread;
public class ThreadTest extends Thread {
String threadId;
public ThreadTest() {
}
public ThreadTest(String threadId) {
this.threadId = threadId;
}
public void run() {
System.out.println("Thread started: " + this.threadId);
for(int i = 0; i < 6; i++) {
System.out.print("i = " +(i + 1)+ "\t");
}
System.out.println("Thread stopped: " + this.threadId);
}
}
Test.java
package com.why.thread;
public class Test {
public static void main(String[] args) {
Thread thread1 = new ThreadTest("thread 1");
Thread thread2 = new ThreadTest("thread 2");
Thread thread3 = new ThreadTest("thread 3");
thread1.start();
thread2.start();
thread3.start();
}
}
运行结果
RunnableTest.java
package com.why.thread;
public class RunnableTest implements Runnable{
String threadId;
public RunnableTest() {
}
public RunnableTest(String threadId) {
this.threadId = threadId;
}
@Override
public void run() {
System.out.println("Thread started: " + this.threadId);
for(int i = 0; i < 6; i++) {
System.out.print("i = " +(i + 1)+ "\t");
}
System.out.println("Thread stopped: " + this.threadId);
}
}
Test.java
package com.why.thread;
public class Test {
public static void main(String[] args) {
RunnableTest runnableTest1 = new RunnableTest("thread1");
RunnableTest runnableTest2 = new RunnableTest("thread2");
Thread thread1 = new Thread(runnableTest1);
Thread thread2 = new Thread(runnableTest2);
thread1.start();
thread2.start();
}
}