欢迎来到爱乐透彩票网开奖结果_爱乐透彩票网手机购彩_爱乐透彩票网新版! 联系我们 网站地图

爱乐透彩票网开奖结果_爱乐透彩票网手机购彩_爱乐透彩票网新版

0379-65557469

爱乐透彩票网开奖结果
全国服务热线
0379-65557469

电话: 0379-65557469
0379-63930906
0379-63900388 
0379-63253525   
传真: 0379-65557469
地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室 

爱乐透彩票网开奖结果

线程的创建和发动

作者:admin 发布时间:2019-05-14 19:48:11 浏览次数:258
打印 收藏 关闭
字体【
视力保护色

Java虚拟机发动时会创立一个主线程,它从发动类的main()办法开端履行。此外,用户还能够创立自己的线程,他将和主线程并发运转。创立办法有两种:

  • 扩展java.lang.Thread类
  • 完成Runnable接口

扩展java.lang.Thread类

Thread类代表线程类,它主要有两个办法:

  • run():包括线程运转时所履行的代码
  • start():用于线程发动

用户的线程只需承继Thread类,掩盖Thread类的run()办法。在Thread类中run()办法界说如下:

public void run()

这个办法没有抛出任何反常,依据办法掩盖的规矩,Thread子类的run()办法也不能声明抛出任何反常。看下面用户自界说的线程类,在run()办法中指定了这个线程所履行的代码:

public class Machine extends Thread {

public void run() {

for(int a=0;a<50;a++){

System.out.println(a);

}

}

public static void main(String[] args) {

Machine machine=new Machine();

machine.start(); //发动线程

}

}

当运转java Machine指令时,Java虚拟机首要创立并发动主线程,主线程的使命是履行main()办法,main办法()创立了一个Machine目标,然后调用它的start()办法发动Machine线程。Machine线程的使命是履行它的run()办法。

经过下面实例,了解线程的运转进程、Thread类的start()办法用法。

  • 示例一:主线程和用户自界说的线程并发运转

public class Machine extends Thread {

public void run() {

for(int a=0;a<50;a++){

System.ou悉尼天气t.println(currentThread().getName()+":"+a);

try{

sleep(100);//给其他线程运转的时机

}catch(InterruptedException e){

throw new RuntimeException(e);

}

}

}

public static void main(String[] args) {

Machine machine1=new Machine();

Machine machine2=new Machine();

machine1.start();

machine2.start();

machine1.run();//主线程履行榜首个machine1的run()办法

}

}

当主线程履行main()办法时,会创立两个Machine目标,然后发动两个Machine线程,接着主线程开端履行榜首个machine目标的run()办法。在虚拟机中,有3个线程并发履行Machine目标的run()办法。在3个线程各自的办法栈中都有代表run()办法的栈桢,在这个桢中寄存了局部变量a,因而每个线程都有自己的局部变量a。

上面代码中,Machine类的run办法里的currentThread().getName()相当于一下代码:

Thread thread =Thread.currentThread();

String name=thread.getName();

Thread类的currentThread()静态办法回来当时线程的引证,Thread类的getName()办法回来线程的姓名。每个线程都有默许姓名,主线程默许姓名是“main”,用户创立的榜首个线程默许姓名是“Thread-0”,第二个线程默许姓名是“Thread-1”,依此类推。Thread类的setName()办法能够设置自界说的线程线程的创建和发动姓名。

为了让每个线程轮番取得CPU,在run()办法中还调用了Thread类的sleep()静态办法,该办法让当时线程抛弃CPU,并睡觉指定长期。

  • 多线程同享一个目标的实例变量

public class Machine extends Thread {

private int a=0;//实例变量

public void run() {

for(a=0;a<50;a++){//运用实例变量a

System.out.println(currentThread().getName()+":"+a);

try{

sleep(100);//给其他线程运转的时机

}catch(InterruptedException e){

throw new RuntimeException(e);

}

}

}

public static void main(String[] args) {

Machine machine=new Machine();

machine.start();//发动一个Machine的线程

machine.run();//主线程履行run()办法

}

}

上面代码,在Machine类中,变量a是一个实例变量,Machine的run()办法调用这个变量a。

运转以上程序,主线程和Machine线程都会履行Machine目标的run()办法。下图显现了主线程和Machine线程并发运转时的运转数据区

我的机器上运转成果:

main:0

Thread-0:0

main:1

Thread-0:2

main:3

Thread-0:4

...

main:46

Thread-0:47

main:48

Thread-0:49

假如对上面的示例代码做修正:

public static void main(String[] args) {

Machine machine1=new Machine();

Machine machine2=new Machine();

machine1.start();

machine2.start();

}

我机器上运转成果:

Thread-0:0

Thread-1:0

Thread-1:1

Thread-0:1

...

Thread-0:49

Thread-1:49

这是由于machine1线程和machine2线程别离履行machine1目标和machine2目标的run()办法,当machine1线程履行run()办法时,会把办法区中run()办法中的变量a解析为machine1目标的实例变量a;machine2线程履行run()办法时,会把办法区中run()办法的变量a解析为m线程的创建和发动ach线程的创建和发动ine2目标的实例变量a,因而machine1线程和machine2线程别离操作不同的实例变量a。

  • 不要随意掩盖Thread类的start()办法

创立一个线程后,线程并不会自定履行,需求调用start()办法后才干发动线程。JDK中Thread类的start()办法的默许完成:

public synchronized void start() {

if (threadStatus != 0)

throw new IllegalThreadStateException();

group.add(this);

boolean started = false;

try {

start0();

started = true;

} finally {

try {

if (!started) {

group.threadStartFailed(this);

}

} catch (Throwable ignore) {

}

}

}

当new句子创立一个线程时,仅仅是在堆区中创立了一个目标,此刻该线程还没有被发动。当线程的start()办法被履行时,会发动线程,在Java栈区为它创立相应的调用栈。

假如要掩盖start()办法,那么要在办法的榜首行调用super.start()。比方:

public class Machine extends Thread {

public void start(){

super.start();

}

public void run() {

...

}

}

  • 一个线程只能被发动一次

一个线程只能被发动一次,不然会报错:

Machine machine=new Machine();

machine.start();

machine.start();

第2次调用machine.start()办法时,会抛出java.lang.IllegalThreadStateException反常

完成Runnable接口

咱们知道承继不能承继多个类,因而一旦一个类承继了Thread类,就不能再承继其他的类。为了处理这一问题,Java供给了java.lang.Runnable接口,它有个run()办法,界说如下:

public void run();

下面是一个完成了Runnable接口的示例代码

public class Machine implements Runnable {

private int a=0;//实例变量

public void run() {

for(a=0;a<50;a++){//运用实例变量a

System.out.println(Thread.currentThread().getName()+":"+a);

try{

Thread.sleep(100);//给其他线程运转的时机

}catch(InterruptedException e){

throw new RuntimeException(e);

}

}

}

public static void main(String[] args) {

Machine machine=new Machine();

Thread t1=new Thread(machine);

Thread t2=new Thread(machine);

t1.start();

t2.start();

}

}

在Thread类中界说了如下方式的结构办法:

主线程创立了t1和t2两个线程目标。当发动t1和t2线程时,都会履行machine变量所引证的Machine目标的run()办法。t1和t2共用一个machine目标,因而在履行run()办法时,操作的是同一个实例变量a,以上程序打印成果:

Thread-0:0

Thread-1:0

Thread-0:1

Thread-1:2

...

Thread-1:47

Thread-0:48

Thread-1:49


目录:Java常识目录

版权所有:洛阳市建设工程咨询有限责任公司 联系人:李经理 电话: 地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室
版权所有 爱乐透彩票网开奖结果 宁ICP备185187936号-9