`

如何创建和启动一个线程? 

阅读更多


一、定义线程 
1、继承java.lang.Thread类。 
此类中有个run()方法,应该注意其用法: 
public void run()

如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 
Thread 的子类应该重写该方法。

 
2、实现java.lang.Runnable接口。 
public  
void run() 

使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。 
方法 run 的常规协定是,它可能执行任何所需的操作。 

二、实例化线程 

1、如果是扩展java.lang.Thread类的线程,则直接new即可。 

2、如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法: 

Java代码 
  1. Thread(Runnable target)   
  2. Thread(Runnable target, String name)   
  3. Thread(ThreadGroup group, Runnable target)   
  4. Thread(ThreadGroup group, Runnable target, String name)   
  5. Thread(ThreadGroup group, Runnable target, String name, long stackSize)   


三、启动线程 

在线程的Thread对象上调用start()方法,而不是run()或者别的方法。 

在调用start()方法之前:线程处于新状态中,新状态指有一个Thread对象,但还没有一个真正的线程。 

在调用start()方法之后:发生了一系列复杂的事情 
启动新的执行线程(具有新的调用栈); 
该线程从新状态转移到可运行状态; 
当该线程获得机会执行时,其目标run()方法将运行。 

注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。 


四、例子 

1、实现Runnable接口的多线程例子 

Java代码 
  1. /**  
  2. * 实现Runnable接口的类  
  3.  
  4. * @author leizhimin 2008-9-13 18:12:10  
  5. */   
  6. public class DoSomething implements Runnable {   
  7.     private String name;   
  8.   
  9.     public DoSomething(String name) {   
  10.         this.name = name;   
  11.     }   
  12.   
  13.     public void run() {   
  14.         for (int i = 0; i < 5; i++) {   
  15.             for (long k = 0; k < 100000000; k++) ;   
  16.             System.out.println(name + ": " + i);   
  17.         }   
  18.     }   
  19. }  
  20.    
  21. /**  
  22. * 测试Runnable类实现的多线程程序  
  23.  
  24. * @author leizhimin 2008-9-13 18:15:02  
  25. */   
  26. public class TestRunnable {   
  27.     public static void main(String[] args) {   
  28.         DoSomething ds1 = new DoSomething("阿三");   
  29.         DoSomething ds2 = new DoSomething("李四");   
  30.   
  31.         Thread t1 = new Thread(ds1);   
  32.         Thread t2 = new Thread(ds2);   
  33.   
  34.         t1.start();   
  35.         t2.start();   
  36.     }   
  37. }  


执行结果: 
李四: 0 
阿三: 0 
李四: 1 
阿三: 1 
李四: 2 
李四: 3 
阿三: 2 
李四: 4 
阿三: 3 
阿三: 4 

Process finished with exit code 0 

2、扩展Thread类实现的多线程例子 

Java代码 
  1. /**  
  2. * 测试扩展Thread类实现的多线程程序  
  3.  
  4. * @author leizhimin 2008-9-13 18:22:13  
  5. */   
  6. public class TestThread extends Thread{   
  7.     public TestThread(String name) {   
  8.         super(name);   
  9.     }   
  10.   
  11.     public void run() {   
  12.         for(int i = 0;i<5;i++){   
  13.             for(long k= 0; k <100000000;k++);   
  14.             System.out.println(this.getName()+" :"+i);   
  15.         }   
  16.     }   
  17.   
  18.     public static void main(String[] args) {   
  19.         Thread t1 = new TestThread("阿三");   
  20.         Thread t2 = new TestThread("李四");   
  21.         t1.start();   
  22.         t2.start();   
  23.     }   
  24. }  


执行结果: 
阿三 :0 
李四 :0 
阿三 :1 
李四 :1 
阿三 :2 
李四 :2 
阿三 :3 
阿三 :4 
李四 :3 
李四 :4 

Process finished with exit code 0 

对于上面的多线程程序代码来说,输出的结果是不确定的。其中的一条语句for(long k= 0; k <100000000;k++);是用来模拟一个非常耗时的操作的。 

五、一些常见问题 

1、线程的名字,一个运行中的线程总是有名字的,名字有两个来源,一个是虚拟机自己给的名字,一个是你自己的定的名字。在没有指定线程名字的情况下,虚拟机总会为线程指定名字,并且主线程的名字总是mian,非主线程的名字不确定。 
2、线程都可以设置名字,也可以获取线程的名字,连主线程也不例外。 
3、获取当前线程的对象的方法是:Thread.currentThread(); 
4、在上面的代码中,只能保证:每个线程都将启动,每个线程都将运行直到完成。一系列线程以某种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程来说,调度程序不能保证其执行次序,持续时间也无法保证。 
5、当线程目标run()方法结束时该线程完成。 
6、一旦线程启动,它就永远不能再重新启动。只有一个新的线程可以被启动,并且只能一次。一个可运行的线程或死线程可以被重新启动。 
7、线程的调度是JVM的一部分,在一个CPU的机器上上,实际上一次只能运行一个线程。一次只有一个线程栈执行。JVM线程调度程序决定实际运行哪个处于可运行状态的线程。 
众多可运行线程中的某一个会被选中做为当前线程。可运行线程被选择运行的顺序是没有保障的。 
8、尽管通常采用队列形式,但这是没有保障的。队列形式是指当一个线程完成“一轮”时,它移到可运行队列的尾部等待,直到它最终排队到该队列的前端为止,它才能被再次选中。事实上,我们把它称为可运行池而不是一个可运行队列,目的是帮助认识线程并不都是以某种有保障的顺序排列唱呢个一个队列的事实。 
9、尽管我们没有无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。 

 

分享到:
评论
1 楼 aa499357363 2015-12-18  
我知道楼主叫雷志民,别问我怎么知道的,。

相关推荐

    13.线程的的实现方式?怎么启动线程?怎么区分线程?.avi

    13.线程的的实现方式?怎么启动线程?怎么区分线程?.avi

    启动两个线程,一个线程打印1~52,另一个线程打印A~Z

    启动两个线程,一个线程打印1~52,另一个线程打印A~Z

    线程创建和管理

    线程创建和管理是多线程编程中一个非常重要的概念,在实际开发中,合理地创建和管理线程可以提高程序的效率和性能。在C#中,线程池和Thread类是两种常用的线程创建和管理方式。 一、线程池(ThreadPool) 线程池是...

    创建一个带三个子线程的程序,第一个线程启动10ms后

    创建一个带三个子线程的程序,第一个线程启动10ms后,第二个线程再启动,然后再等待10ms后第三个线程启动,每一个线程从1—1000循环输出线程的名称和计数,当三个线程结束时要输出各自的结束信息,然后主线程结束。

    易语言多线程多次启动一个子程序

    在多线程环境中,同一个子程序可以被多次启动,每个启动都会创建一个新的线程实例。为了确保线程安全,需要考虑以下几个方面: 1. **资源竞争**:当多个线程访问同一资源时,可能会引发数据不一致问题。易语言提供...

    什么是线程?Java中如何创建和管理线程?(java面试题附答案).txt

    ### 什么是线程? 在计算机科学中,**线程**是指程序执行中的最小单位,它是一种轻量级的进程,或者说是在程序运行时能够独立执行的一条路径。一个程序可以包含多个线程,这些线程可以同时运行,共享程序的内存空间...

    Java使用Callable和Future创建线程操作示例

    创建并启动线程的步骤如下: 1. 创建Callable接口的实现类,并实现call()方法,该call()方法将作为该线程的执行体,且该call()方法有返回值,再创建Callable的实例。从Java 8开始,可以直接使用Lamda表达式创建...

    一个简单的多线程例子,启动线程与终止线程。

    本示例提供了一个简单的多线程应用,旨在帮助理解如何创建、启动和停止线程。以下将详细讲解相关知识点。 首先,我们讨论如何**创建多线程**。在Java中,有两种主要的方法来创建线程:通过继承Thread类或实现...

    易语言启动线程+循环+延时=时钟(循环)源码,易语言启动线程+循环+

    结合以上知识点,标题和描述中提到的“易语言启动线程+循环+延时=时钟(循环)源码”是指用易语言编写的一个程序,该程序启动一个新的线程,并在这个线程中进行循环操作。在每次循环中,程序会使用延时命令让当前循环...

    易语言类中启动线程

    在易语言类中启动线程,意味着在类的一个实例中创建一个新的执行流,这个执行流独立于创建它的主线程和其他线程,可以并行执行特定的任务。 3. 易语言线程创建: 易语言提供了“创建线程”命令来创建新的线程。通常...

    C# winform动态创建和关闭多线程源码 可运行

    本项目“C# Winform动态创建和关闭多线程源码 可运行”提供了一个完整的解决方案,适用于Visual Studio 2010,它演示了如何在Winform应用中灵活地创建和管理多个线程。 一、线程基础 线程是操作系统分配CPU时间的...

    MFC多线程的创建,包括工作线程和用户界面线程

    - **启动线程**:`ResumeThread` 使一个挂起状态的线程继续执行。 - **挂起线程**:`SuspendThread` 将正在运行的线程置于挂起状态,即停止执行。 通过这些方法可以有效地控制线程的执行状态。 #### 七、总结 MFC...

    易语言CreateThread启动线程传递多个类型参数.rar

    综上所述,"易语言CreateThread启动线程传递多个类型参数.rar"这个资源包提供了一个解决在易语言中使用`CreateThread`创建多线程并传递多种类型参数的方法。通过学习和应用这个示例,开发者能够更好地理解和掌握...

    实验4 线程编程实验.doc

    线程编程实验 本实验的主要目的是了解多...本实验为我们提供了一个了解多线程的概念和应用的机会,我们可以通过实验来掌握线程的创建方法和任务类,理解事件分发线程机制和线程池的概念及应用,以及线程的同步和异步。

    VS2019 MFC线程的创建

    - **主线程** 是程序运行时自动创建的第一个线程,负责启动应用程序。 - **工作线程** 或 **子线程** 是由程序员创建的额外线程,用于执行特定任务,与主线程并行执行。 2. **MFC中的线程类** - `CWinThread` 类...

    C# Winform线程创建子窗体

    这段代码创建了一个新线程,并在其上下文中创建并显示了子窗体。注意,`Thread.Start()`启动了新线程。 然而,跨线程操作主窗体的控件可能会引发`CrossThreadException`异常,因为Windows Forms控件只能在其创建的...

    易语言启动线程参数的用处

    子程序1可能就是这样一个启动线程的入口,它接收参数,创建并启动新的线程,然后在线程的主函数中使用这些参数。 学习易语言启动线程参数的用处,有助于开发者更好地理解和利用线程,编写出更高效、更稳定的多线程...

    C#内存释放-线程控制-线程启动-线程暂停

    本文将深入探讨“C#内存释放-线程控制-线程启动-线程暂停”这一主题,结合提供的WFormsThread文件,我们可以假设这是一个关于Windows Forms应用程序中线程管理的实例。 首先,让我们关注线程控制。在C#中,我们通常...

    【C#多线程】 动态创建多个线程后 需要关闭其中某个线程的解决实例。

    例如: for (int i = 0; i ; i++) { ...如何关闭其中的一个线程呢? 请下载解决方案。 呵呵,这个实例10分值的买, 觉得好的话就评个分吧,评分后会返回你11分 (一定要评分,光评论是不返分的)

    Delphi7创建及释放线程实例

    3. **创建和启动线程:** - 在需要启动新线程的地方,创建`TMyThread`的实例,例如`MyThread := TMyThread.Create(True);` - 如果在创建时设置了`Suspended=True`,则需要调用`MyThread.Resume;`来启动线程。 4. ...

Global site tag (gtag.js) - Google Analytics