【每天两小时】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线程运行,这样就又同时干活的效果;

 

posted @ 2012-12-04 23:08  广州_大臣  阅读(246)  评论(0编辑  收藏  举报