如果要特别专业地去理解线程的话,这个可能要去看操作系统原理了,什么cpu的执行,怎么把一个进程调进来
我们要理解的话,就————线程就是一个程序里面不同的执行路径。
看个例子:
每一个长方形都是个方法,黄色那个是main方法,右边那个是m1方法,再右边是m2,m3方法
这么多方法,我们这个有几个线程呢?由红色的先可以看出,这个程序虽然有好几个方法,但程序的执行路径只有一条,也就是只有一个线程。
像左下角那个图两条执行路径同时进行这样的就是多线程。每一个分支都叫一个线程
也就是说我们现在学的只有一个分支,就是我们的main方法,这个叫主分支,也叫主线程,所以main方法叫做主线程。
现在我们要说清楚进程这个概念。
进程,只是一个静态的概念:机器上的一个class文件,机器上的一个exe文件。比如一个代码放进了代码区,放到了内存里面,它执行了吗?没有。说明一个进程已经准备开始了,进程已经产生了但还没有开始执行,我们平时说的进程的执行指的是进程里面的主线程即main方法开始执行了。 进程是个静态的概念,在机器里运行的都是线程。 一般现在的操作系统都是多进程,多线程的操作系统。
其实cpu在一个时间点只能支持一个线程的执行,只是cpu的计算速度太快了,一秒几亿次,它把时间分成很多段,这一小段执行你这个线程,下个时间段执行下一个线程,但它速度太快了,所以对于我们来说就好像就好像多线程一样。 真正的多线程是多cpu或者多核。
好滴现在我们怎么样才可以起一个新的路径呢?
这个由java.lang.Thread这个类来搞定,new一个thread对象一个新的线程就实现了。
然后什么run()方法运行,start()方法启动。
run你要起一个新的线程你要有东西执行才行啊,你在run方法里面写什么东西它就执行什么东西。
例子:
我们搞了一个类,Runner1,实现了runnable接口,重写了run()方法。run里面就是你新线程要执行的内容。
然后thread了一个新线程
线程启动必须记住!一定要调用thread这个类的start()方法。它就是通知cpu现在有新线程了。
当start()之后,这个程序就多了个执行路径,它们并行(交替)执行!我们可以从执行情况看出来
但如果我们直接执行这个r的run()方法的话呢?
这里就不再是多个线程多个分支了,而是简单的方法调用。
输出结果是主线程的main方法那100个数输出完了之后再输runner1里面那个run方法的100个数。
总之线程启动一定要调用thread这个类的start方法
还有第二种启动线程的方法,就是继承Thread类
public class TestThread1_2 { public static void main(String[] args) { Runner2 r2 = new Runner2(); r2.start(); for(int i = 0 ; i < 100 ; i++ ) { System.out.println("main thread :"+i); } } } class Runner2 extends Thread {//继承thread类 public void run() { for(int i = 0 ; i < 100 ; i++ ) { System.out.println("Runner2 :"+i); } } }
不过一般可以用接口就尽量用接口,因为继承你就只能继承一个类,接口你可以实现几个。所以尽量用接口。