讲解java多线程的问题之前,我们需要了解两个概念:
1.进程:可以先简单理解为,就是我们开发的完成某种部分功能的程序代码在CPU中跑起来之后的样子。所以进程应该是操作系统分配的内存空间+1个或多个线程组成的。
2.线程:可以理解为组成进程的一些代码流,这些代码流跑起来就叫线程。线程不能单独存在,它必须依托线程。
举个例子:
public class ArrayListTest {上面代码跑起来就叫一个进程,功能是打印出一个ArrayList集合内容。显然,这个进程只有一个线程。
public static void main(String[] args) {
ArrayList<String> s = new ArrayList<String>();
s.add("first");
s.add("second");
s.add(1, "third");
for(String k : s){
System.out.println(k);
}
}
}
现在想同时让这个进程打印好几种内容,每种内容由一个线程去完成。
我这里是用实现Runable接口的方式实现多线程编程的。
//创建一个Thread1线程类
public class Thread1 implements Runnable {
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void run() {
<span style="white-space:pre"> </span>for(int i=0;i<5;i++){
<span style="white-space:pre"> </span>System.out.println("Thread1: 线程Thread1执行的内容!"+i);
<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
}
//创建一个Thread2线程类public class Thread2 implements Runnable{<span style="white-space:pre"> </span>@Override<span style="white-space:pre"> </span>public void run() {<span style="white-space:pre"> </span>for(int i=0;i<5;i++){<span style="white-space:pre"> </span>System.out.println("Thread2: 线程Thread2执行的内容!"+i);<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span>}}然后在主类中执行定义的两个线程,让这两个线程同时执行,完成各自的功能任务。
public class RunThread {运行主类之后,我们可以看到,两个线程ta,tb都得到了执行,而且每次打印顺序都不一样,因为两个线程再主进程中是并发执行的。
public static void main(String[] args) {
//定义线程要执行的目标对象
Thread1 th1 = new Thread1();
Thread2 th2 = new Thread2();
//创建线程,设置线程执行对象和线程名称
Thread ta = new Thread(th1,"A");
Thread tb = new Thread(th2,"B");
//执行线程
ta.start();
tb.start();
}
}