`
xdlliutao
  • 浏览: 35700 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java多线程的创建方法

阅读更多
Java 线程类也是一个 object 类,它的实例都继承自java.lang.Thread 或其子类。 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法:



Tread thread = new Thread();

thread.start();



在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了。



编写线程运行时执行的代码有两种方式:一种是创建Thread 子类的一个实例并重写 run 方法,第二种是创建类的时候实现 Runnable 接口。接下来我们会具体讲解这两种方法:



创建 Thread 的子类



创建 Thread 子类的一个实例并重写 run 方法,run 方法会在调用 start()方法之后被执行。可以用如下方式创建并运行上述 Thread 子类例子如下:



public class MyThread extends Thread {

public void run(){

   System.out.println("MyThread running");

  }

}

MyThread myThread = new MyThread();

myTread.start();



一旦线程启动后 start 方法就会立即返回,而不会等待到 run 方法执行完毕才返回。就好像 run 方法是在另外一个 cpu 上执行一样。当 run 方法执行后,将会打印出字符串 MyThread running。



你也可以如下创建一个 Thread 的匿名子类:



Thread thread = new Thread(){

public void run(){

   System.out.println("Thread Running");

  }

};

thread.start();



当新的线程的 run 方法执行以后,计算机将会打印出字符串”Thread Running”。



实现 Runnable 接口



第二种编写线程执行代码的方式是新建一个实现了java.lang.Runnable 接口的类的实例,实例中的方法可以被线程调用。下面给出例子:



public class MyRunnable implements Runnable{

public void run(){

   System.out.println("MyRunnable running");

  }

}



为了使线程能够执行 run()方法,需要在 Thread 类的构造函数中传入MyRunnable 的实例对象。示例如下:



Thread thread = new Thread(newMyRunnable());

thread.start();



当线程运行时,它将会调用实现了 Runnable接口的 run 方法。上例中将会打印出”MyRunnable running”。



同样,也可以创建一个实现了 Runnable 接口的匿名类,如下所示:



Runnable myRunnable = new Runnable(){

public void run(){

   System.out.println("Runnable running");

  }

}

Thread thread = new Thread(myRunnable);

thread.start();



创建子类还是实现 Runnable 接口?



对于这两种方式哪种好并没有一个确定的答案,它们都能满足要求。就我个人意见,我更倾向于实现 Runnable 接口这种方法。因为线程池可以有效的管理实现了 Runnable 接口的线程,如果线程池满了,新的线程就会排队等候执行,直到线程池空闲出来为止。而如果线程是通过实现 Thread 子类实现的,这将会复杂一些。



有时我们要同时融合实现 Runnable 接口和 Thread 子类两种方式。例如,实现了Thread 子类的实例可以执行多个实现了 Runnable 接口的线程。一个典型的应用就是线程池。



常见错误:调用 run()方法而非 start()方法



创建并运行一个线程所犯的常见错误是调用线程的run()方法而非 start()方法,如下所示:



Thread newThread = newThread(MyRunnable());

newThread.run();  //should be start();



起初你并不会感觉到有什么不妥,因为 run()方法的确如你所愿的被调用了。但是,事实上,run()方法并非是由刚创建的新线程所执行的,而是被创建新线程的当前线程所执行了。也就是被执行上面两行代码的线程所执行的。想要让创建的新线程执行 run()方法,必须调用新线程的 start 方法。



线程名



当创建一个线程的时候,可以给线程起一个名字。它有助于我们区分不同的线程。例如:如果有多个线程写入 System.out,我们就能够通过线程名容易的找出是哪个线程正在输出。例子如下:



MyRunnable runnable = new MyRunnable();

Thread thread = new Thread(runnable,"New Thread");

thread.start();

System.out.println(thread.getName());



需要注意的是,因为 MyRunnable 并非 Thread 的子类,所以MyRunnable 类并没有 getName()方法。可以通过以下方式得到当前线程的引用:



Thread.currentThread();

String threadName =Thread.currentThread().getName();



线程代码举例:



这里是一个小小的例子。首先输出执行main()方法线程名字。这个线程 JVM 分配的。然后开启 10 个线程,命名为 1~10。每个线程输出自己的名字后就退出。



public class ThreadExample {

public static void main(String[] args){

   System.out.println(Thread.currentThread().getName());

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

       new Thread("" + i){

           public void run(){

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

           }

       }.start();

     }

  }

}



兄弟连(www.lampbrother.net

)在这里提示你需要注意的是,尽管启动线程的顺序是有序的,但是执行的顺序并非是有序的。也就是说,1 号线程并不一定是第一个将自己名字输出到控制台的线程。这是因为线程是并行执行而非顺序的。Jvm 和操作系统一起决定了线程的执行顺序,他和线程的启动顺序并非一定是一致的。
分享到:
评论

相关推荐

    java多线程ppt

    java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题

    Java多线程编程总结

    Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...

    java多线程编程总结

    详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...

    java多线程笔记

    Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 13 Java线程:线程的调度-优先级 16 Java线程:线程的调度-让步 19 Java线程:线程的...

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    Java多线程.pdf

    Java多线程复习笔记,包括线程创建,关键字讲解,线程池等等。

    Java 多线程的创建及方法、优先级.docx

    Java 多线程的创建及方法、优先级

    史上最全 Java 多线程面试题及答案.docx

    本文总结了 Java 多线程的知识点,涵盖了多线程的用途、创建线程的方式、start() 方法和 run() 方法的区别、Runnable 接口和 Callable 接口的区别、CyclicBarrier 和 CountDownLatch 的区别等多个方面,旨在帮助读者...

    java多线程示例

    Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并...

    java多线程编程 在主线程main中创建两个子线程

    自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    java多线程知识点,源代码案例,代码案例中包括如何创建线程,主线程,线程优先级,线程组,线程同步,死锁,线程间的通信知识点

    Java多线程网络爬虫(时光网为例)源码

    Java多线程网络爬虫(时光网为例)源码,为maven创建,有不明白请看我的博客介绍;转载请用连接注明出处。近期有人,将本人博客直接复制上传到百度文科等平台,不尊重个人努力成果。

    java多线程机制 详解

    了解Java的多线程机制 掌握创建线程的两个方法 熟悉线程的常用方法 掌握线程同步的意义

    JAVA的多线程使用讲解

    JAVA多线程使用讲解,如何创建线程,讲解如何使用多线程,以及线程的等待与唤醒。 JAVA多线程使用讲解,如何创建线程,讲解如何使用多线程,以及线程的等待与唤醒。 JAVA多线程使用讲解,如何创建线程,讲解如何使用...

    Java多线程-JDK5.0新增线程创建方式

    Java多线程--JDK5.0新增线程创建方式

    Java多线程-创建多线程的基本方式一:继承Thread类

    Java多线程--创建多线程的基本方式一:继承Thread类

    Java多线程-对比创建多线程的两种方式

    Java多线程--对比创建多线程的两种方式

Global site tag (gtag.js) - Google Analytics