2016/2/18

一、     java多线程

线程达到的效果是能够并发执行

1、java要实现多线程有两种方式:

 

l        继承Thread类

l        实现Runnable接口

(一)Thread

Thread类:一个方法只要继承了Thread类,此类就成为多线程操作类。在Thread子类中,必须明确覆写Thread类中的run()方法,此方法为线程的主体。多线程的定义语法:

Pulic class 类名称 extends Thread{-----继承Thread类

属性;------------类中的属性

方法;-------------类中的方法

Public void run(){-----------覆写Thread的方法

线程主体;

}

}

2、package com.hx.thread;

import java.security.PublicKey;

public class MyThread extends Thread{

    String name;//线程的属性

    public MyThread(String name){

       this.name=name;

    }

    public void run(){//覆写Thread中的run方法,是线程的操作主体

       for (int i = 0; i < 4; i++) {

           System.out.println(name+"--"+i);

       }

    }

}

public class MyThreadTest {

    public static void main(String[] args) {

       MyThread m1=new MyThread("线程A");

       MyThread m2=new MyThread("线程B");

       m1.run();//调用线程主体

       m2.run();

    }

}

运行结果是:线程A--0

线程A--1

线程A--2

线程A--3

线程B--0

线程B--1

线程B--2

线程B—3

以上调用还是先执行A后执行B,并没有达到并发执行的效果。

还是通过对象名.方法名,如果要想启动一个线程必须使用Thread类中定义的start()方法。

一旦调用start()方法,实际上调用的就是run()方法。

public class MyThreadTest {

    public static void main(String[] args) {

       MyThread m1=new MyThread("线程A");

       MyThread m2=new MyThread("线程B");

       m1.start();//调用线程主体

       m2.start();

    }

}

效果如下:线程B--0

线程A--0

线程A--1

线程A--2

线程B--1

线程A--3

线程B--2

线程B--3

此时达到了并发执行的效果

*****一个线程只能被调用一次。

3、要想实现多线程需要操作系统的支持,因为牵扯到抢占cpu的情况,要等待cpu进行调度,需要使用native调用本机的系统函数。

(二)runnable接口

Runnable的定义语法:

Pulic class 类名称 implements Runnable{-----实现Runnable接口

属性;------------类中的属性

方法;-------------类中的方法

Public void run(){-----------覆写Thread的方法

线程主体;

}

}

如果想启动线程则肯定依靠Thread类,但是之前如果直接继承了Thread类,则可以将start()方法直接继承下来使用,但是Runnable接口中并没有此方法。可以利用public Thread(Runnable target)

这个构造方法。来启动线程

如:public class MyThreadTest {

    public static void main(String[] args) {

       MyThread m1=new MyThread("x1");

       MyThread m2=new MyThread("x2");

       Thread t1=new Thread(m1);//实例化Thread类public Thread(Runnable target)

 

       Thread t2=new Thread(m2);

       t1.start();//调用线程主体

       t2.start();

    }

}

Thread类是Runnable 的子类。

Runable接口可以共享资源而Thread则不可以。

(三)Thread和Runnable接口的使用结论

实现Runnable接口比继承Thread类 有如下的明显优点

l       适合多个相同程序代码的线程去处理同一个资源

l       可以避免单继承带来的影响

l       增强了程序的健壮性,能够实现多个进程共享,代码与数据独立

开发中使用Runnable接口是最合适的。

(四)线程的状态

  • 创建状态:准备好了一个多线程的对象:Thread t=new Thread()
  • 就绪状态:调用了start()方法,等待cpu进行调度
  • 运行状态:执行run()方法
  • 阻塞状态:暂时停止执行,可能把资源交给其他线程使用
  • 终止状态:线程执行完毕

 

实际上,线程调用start()方法 的时候不是立即启动的,而是等待cpu 进行调度

(五)总结

(1)线程是进程的执行单元。线程消失了进程不会消失,而进程消失了则线程一定会消失。

(2)线程的启动:通过start() 方法完成,需要进行cpu 调度,调用start()实际上就是调用run()方法。

(3)Thread是Runnable的子类,使用了代理机制完成。

(4)开发中使用Runnable接口是最合适的,能够达到资源共享。

你可能感兴趣的:(2016/2/18)