【每天两小时】java 多线程初识
前言
学习线程之前,要认识进程和线程的区别:
1,线程是属于进程的,一个进程至少包括一个线程;
2,线程是一段程序片段,进程是一个应用程序的代码,数据;多线程的意义在于一个应用程序中,有多个执行部分可以同时执行
3,线程共享进程的地址空间,而进程有自己独立的地址空间(因为两个不同的应用程序);
4,CPU调度的线程,操作系统进行资源分配的是进程;
5,进程撤销,线程也撤销;因为在里面;
正文
创建线程有两种方式:
1, 继承 Thread 对象.重现里面的run方法
2, 向Thread 类对象传递:Runnable对象(该对象要继承Runnable这个接口),同时实现Runnablea里面的run方法;
第一种编写方法:
ThreadOne.java
1
2
3
4
5
6
7
|
public class ThreadOne extends Thread { @Override public void run() { System.out.println( "this is ThreadOne" ); } } |
第二种编写方法:(推荐这种写法,这样的写法才具有面向对象,可以想想,每次只要生成Runable类,直接放进Thread类,即可 )
1
2
3
4
5
6
7
|
public class ThreadRunable implements Runnable { @Override public void run() { System.out.println( "this is ThreadRunable" ); } } |
MainThread.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class MainThread { /** * @param args */ public static void main(String[] args) { Thread threadone = new ThreadOne(); //第一种 threadone.start(); Thread threadrunable = new Thread( new ThreadRunable()); //第二种 threadrunable.start();
|
Q:如果继承了Thread类,又向Thread类传递Runable参数,这时候会执行那个run方法呢???
1
2
3
4
5
6
7
|
new Thread( new ThreadRunable()){ @Override public void run() { System.out.println( "thread :" + Thread.currentThread().getName()); } }.start(); |
运行的结果:thread :Thread-0
一直很奇怪,什么会是子类的输出的呢,配置下src.zip 看了源码;下面是Thread.java 的部分代码:
Thread.java
1
|
private Runnable target; |
1
2
3
4
5
|
public void run() { if (target != null ) { target.run(); } } |
1
2
3
4
5
6
7
8
|
private void init(ThreadGroup g, Runnable target, String name) { ````````````````````` ``````````````````````` this .target = target; ``````````````````````` ``````````````````````` } |
上代码调用start()方法的时候,会去调用Thread子类的run()方法,(上述代码是匿名继承类) 子类的run( )如果没有重写,就执行父类的run(),就判断 target 是不是为空,如果不为空,就执行target.run(),target就是传入的实现Runnable的子类。target是在init 这个方法的时候,被赋值的;
上述代码,很明显重写了子类的run方法。所以输出子类的字符串;
总结
画出一个图,我对线程的理解:我们在运行一个java程序的时候,会产生一个进程,java程序有个main进口,只时候会产生一个main线程,
也就是main方法(MainThread)其实也是一个线程,而且是主线程;主线程再生出ThreadOne,ThreadRunable等线程,让它们独立与main线程运行,这样就又同时干活的效果;