`
xiasheng
  • 浏览: 70673 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

创建与启动

阅读更多
SCJP5学习笔记
 
一、定义线程
 
1、扩展java.lang.Thread类。
 
此类中有个run()方法,应该注意其用法:
public void run()
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
 
Thread 的子类应该重写该方法。
2、实现java.lang.Runnable接口。
 
void run()
使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。
 
方法 run 的常规协定是,它可能执行任何所需的操作。
 
二、实例化线程
 
1、如果是扩展java.lang.Thread类的线程,则直接new即可。
 
2、如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法:
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
 
三、启动线程
 
在线程的Thread对象上调用start()方法,而不是run()或者别的方法。
 
在调用start()方法之前:线程处于新状态中,新状态指有一个Thread对象,但还没有一个真正的线程。
 
在调用start()方法之后:发生了一系列复杂的事情
启动新的执行线程(具有新的调用栈);
该线程从新状态转移到可运行状态;
当该线程获得机会执行时,其目标run()方法将运行。
 
注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。
 
 
四、例子
 
1、实现Runnable接口的多线程例子
/**
* 实现Runnable接口的类
*
* @author leizhimin 2008-9-13 18:12:10
*/

public class DoSomething implements Runnable {
    private String name;

    public DoSomething(String name) {
        this.name = name;
    }

    public void run() {
        for (int i = 0; i < 5; i++) {
            for (long k = 0; k < 100000000; k++) ;
            System.out.println(name + ": " + i);
        }
    }
}
 
/**
* 测试Runnable类实现的多线程程序
*
* @author leizhimin 2008-9-13 18:15:02
*/

public class TestRunnable {
    public static void main(String[] args) {
        DoSomething ds1 = new DoSomething("阿三");
        DoSomething ds2 = new DoSomething("李四");

        Thread t1 = new Thread(ds1);
        Thread t2 = new Thread(ds2);

        t1.start();
        t2.start();
    }
}
 
执行结果:
李四: 0
阿三: 0
李四: 1
阿三: 1
李四: 2
李四: 3
阿三: 2
李四: 4
阿三: 3
阿三: 4

Process finished with exit code 0
 
2、扩展Thread类实现的多线程例子
 
/**
* 测试扩展Thread类实现的多线程程序
*
* @author leizhimin 2008-9-13 18:22:13
*/

public class TestThread extends Thread{
    public TestThread(String name) {
        super(name);
    }

    public void run() {
        for(int i = 0;i<5;i++){
            for(long k= 0; k <100000000;k++);
            System.out.println(this.getName()+" :"+i);
        }
    }

    public static void main(String[] args) {
        Thread t1 = new TestThread("阿三");
        Thread t2 = new TestThread("李四");
        t1.start();
        t2.start();
    }
}
 
执行结果:
阿三 :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、尽管我们没有无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。
 

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/99151

分享到:
评论

相关推荐

    Visual C++源代码 20 如何创建开机自启动程序

    Visual C++源代码 20 如何创建开机自启动程序Visual C++源代码 20 如何创建开机自启动程序Visual C++源代码 20 如何创建开机自启动程序Visual C++源代码 20 如何创建开机自启动程序Visual C++源代码 20 如何创建开机...

    浅谈android性能优化之启动过程(冷启动和热启动)

    在热启动中,因为会从已有的进程中来启动,所以热启动就不会走 Application 这步了,而是直接走 MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个 MainActivity 就行了,而...

    创建启动文件(ISO)

    3. **刻录光盘**:除了创建和编辑ISO文件, UltraISO还允许用户将ISO文件刻录到CD、DVD或蓝光光盘上,确保与原始光盘内容一致。 4. **虚拟驱动器**:软件内置虚拟光驱功能,可以直接挂载ISO文件,无需物理光驱就能...

    用C++Builder创建应用程序启动窗口.pdf

    **步骤2:** 建立一个新窗口作为启动窗口,设置其`BorderStyle`为`bsNone`以去除窗体边界,系统菜单和控制图标,使其更像一个“纯”画面。可以通过向窗口添加`Image`控件并设置其`Picture`属性来加载启动画面或版权...

    WinImage8 创建各种启动盘

    WinImage8是一款强大的磁盘映像管理工具,尤其在创建和管理启动盘方面表现出色。本文将深入探讨如何使用WinImage8来创建各种类型的启动盘,包括传统的软盘启动盘、USB启动盘以及光盘映像,以满足不同场景下的系统...

    创建与启动手机模拟器和学习使用ANDROID操作系统

    电脑安卓模拟器安装图解教程 如果你没有安卓手机,你可以使用安卓模拟器,来模拟使用安卓系统。

    U盘创建DOS启动盘中文制作工具

    标题中的“U盘创建DOS启动盘中文制作工具”指的是一个可以帮助用户利用U盘来创建一个可引导的DOS系统启动盘的程序。这个工具的主要目的是在计算机系统无法正常启动时,通过DOS系统进行紧急修复或数据恢复。DOS(磁盘...

    Delphi创建桌面快捷方式和设置开机自启动

    在Delphi编程环境中,创建桌面快捷方式和设置应用程序开机自启动是常见的系统集成步骤,这有助于用户更加方便地访问和管理程序。以下将详细介绍如何通过Delphi实现这两个功能。 首先,我们来讨论如何创建桌面快捷...

    web监听端口(Socket服务随web启动而启动)

    在Java等编程语言中,Socket API允许开发者创建Socket对象来建立连接并交换数据。 接下来,我们转向Tomcat,这是一个广泛使用的开源Java Servlet容器,主要用于运行Java Web应用程序。Tomcat作为Web服务器,监听...

    Unity 创建快捷方式自动启动

    Unity 创建快捷方式自动启动 允许脚本后会自动在自动启动文件夹中添加当前exe的快捷方式,这样后面开启就可以自动启动程序了 食用方法: 1.导入到unity编辑器 2.把ZYF_AutoRunApp挂到场景物体上 3.打包即可

    Rufus创建Windows Server 2019 UEFI启动盘.rar

    在IT领域,创建一个用于安装操作系统的启动盘是常见的任务,尤其当涉及到服务器级别的系统,如Windows Server 2019。在这个场景中,我们使用的是Rufus工具,一个非常流行的、免费的、轻量级的软件,专门用于制作USB...

    C# winform程序实现开机自启动,并且识别是开机启动还是双击启动

    在本文中,我们将深入探讨如何使用C# Winform技术创建一个程序,使其能够实现开机自启动,并能区分是开机启动还是用户双击运行。Winform是.NET Framework中的一个强大工具,用于构建桌面应用程序,而C#是其常用的...

    Arm-linux 自定义开机启动程序,避开从桌面启动

    接下来,在工程目录下创建一个启动脚本。这里创建了一个名为`MyUI.py`的脚本,但实际上也可以直接创建一个`.sh`脚本,因为它本质上是一个Shell脚本。该脚本的作用主要是设置必要的环境变量,并指向Qt程序的位置。...

    WPF启动动画demo

    同时,启动动画的定义通常在XAML文件中完成,与UI设计紧密相连。 6. **优化性能**: 虽然启动动画可以提升用户体验,但过度复杂的动画可能会增加启动时间。因此,开发者需要注意平衡动画的复杂性和性能。使用适当的...

    易语言快捷方式启动

    在“易语言快捷方式启动”这个主题中,我们主要探讨的是如何使用易语言来实现快捷方式的创建、启动以及与系统启动目录的交互。 首先,快捷方式启动是指通过快捷方式图标来执行某个程序或打开特定文件的一种方式。在...

    启动光盘制作工具

    6. **系统兼容性**:启动易通常能够与多种操作系统兼容,包括Windows XP、Windows 7、Windows 8/8.1以及Windows 10等,确保在各种环境下都能正常使用。 7. **应急救援**:在系统崩溃或病毒攻击的情况下,启动易制作...

    C# WPF 创建启动参数的简单实例

    在C# WPF(Windows Presentation Foundation)开发中,创建启动参数是常见的需求,这使得程序在启动时可以接收外部输入,比如命令行参数或者配置文件。这个实例将帮助开发者了解如何在WPF应用中处理这些参数,从而...

    QT实现程序启动界面

    压缩包内的"Test"文件可能是测试代码或者测试资源,而"StartSurface"可能是一个包含启动界面逻辑的源代码文件,或者是与启动界面相关的资源文件,比如图片或配置文件。 总的来说,这个项目涉及到QT的GUI编程,具体...

Global site tag (gtag.js) - Google Analytics