看看对Thread到底懂多少,嘿嘿
Example1:
public class Bground extends Thread{ public static void main(String argv[]) { Bground b = new Bground(); b.run(); } public void start() { for (int i = 0; i <10; i++){ System.out.println("Value of i = " + i); } } }
结果:
编译无错,但不打印任何值。调用run不创建线程
Example2:
public class Bground extends Thread{ public static void main(String argv[]) { //Bground b = new Bground(); Thread b = new Thread(new MyRunnable()); b.run(); } public void start() { for (int i = 0; i <10; i++){ System.out.println("Value of i = " + i); } } } class MyRunnable implements Runnable{ @Override public void run() { for (int i = 0; i <10; i++){ System.out.println("Value of i = " + i); } } }
结果:
Value of i = 0
Value of i = 1
Value of i = 2
Value of i = 3
Value of i = 4
Value of i = 5
Value of i = 6
Value of i = 7
Value of i = 8
Value of i = 9
不是说线程是调用start()方法执行的么,怎么调用run()方法也执行了呢??
查看API发现:
/** * Causes this thread to begin execution; the Java Virtual Machine * calls the <code>run</code> method of this thread. */ public synchronized void start() {..} /** * If this thread was constructed using a separate * <code>Runnable</code> run object, then that * <code>Runnable</code> object's <code>run</code> method is called; * otherwise, this method does nothing and returns. */ public void run() { if (target != null) { target.run(); } }
调用线程类的run()方法时,如果该线程是实现的Runnable接口,那么调用run()时就会执行该Runnable,否则无反应。
原来如此!
Example3:
public class Bground extends Thread{ public static void main(String argv[]) { Bground b = new Bground(); b.start(); } public void start() { for (int i = 0; i <10; i++){ System.out.println("Value of i = " + i); } } }
结果:
Value of i = 0
Value of i = 1
Value of i = 2
Value of i = 3
Value of i = 4
Value of i = 5
Value of i = 6
Value of i = 7
Value of i = 8
Value of i = 9
我可以重载start()方法么?
因为Thread类的start()方法并不是final方法,因此可以,但不推荐这样做。因为在start()方法里创建一个新的线程,进行特定的操作。你可以传递一个实现了Runnable接口的类到Thread,或者继承Thread类,重载run()方法。
此处启动线程时会调用线程的run()方法(此处为空),但本身的start()方法也被当作普通方法执行。
注意继承了Thread的线程类,里面的实现方法也是run()方法,跟Runnable接口的一样。
public class MyThread extends Thread { public void run() { for (int i = 0; i < 100; i++) { ... } } public static void main(String[] args) { new MyThread().start(); } }
Example4:
public class Bground extends Thread { public static void main(String argv[]) { Bground b = new Bground(); b.start(); System.out.println(b.isAlive()); //System.out.println(Thread.currentThread().getThreadGroup().getName()); } public void start() { //System.out.println(Thread.currentThread().getThreadGroup().getName()); for (int i = 0; i < 10; i++) { System.out.println("Value of i = " + i); } } public void run() { for (int i = 0; i < 10; i++) { System.out.println("Run : Value of i = " + i); } } }
又有run()方法,又有start()方法,结果多少??
结果:
Value of i = 0
Value of i = 1
Value of i = 2
Value of i = 3
Value of i = 4
Value of i = 5
Value of i = 6
Value of i = 7
Value of i = 8
Value of i = 9
false
说明什么??
说明此时线程根本没有执行,像一个普通类一样仅调用了start()方法。
那么去掉start()方法呢?
结果:
true
Run : Value of i = 0
Run : Value of i = 1
Run : Value of i = 2
Run : Value of i = 3
Run : Value of i = 4
Run : Value of i = 5
Run : Value of i = 6
Run : Value of i = 7
Run : Value of i = 8
Run : Value of i = 9
此时线程才真正执行了!
Example5:
public class Test extends Thread { private String sThreadName; Test() { } Test(String s) { sThreadName = s; } public String getThreadName() { return sThreadName; } public void go() { Test first = new Test("first"); first.start(); Test second = new Test("second"); second.start(); } public static void main(String argv[]) { Test h = new Test(); h.go(); } public void start() { for (int i = 0; i < 2; i++) { System.out.println(getThreadName() + i); try { Thread.sleep(100); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } } }
结果你以为是:输出first0, second0, first1, second1.(1)
哈哈,错了!!!
结果为:
first0
first1
second0
second1
如果要实现(1)的效果的话应该重载run,而不是start,此处仅相当于执行了start()方法。
Example6:
public class Test { public static void main(String argv[]) { Pmcraven pm1 = new Pmcraven("one"); pm1.run(); Pmcraven pm2 = new Pmcraven("two"); pm2.run(); } } class Pmcraven extends Thread { private String sTname = ""; Pmcraven(String s) { sTname = s; } public void run() { for (int i = 0; i < 2; i++) { try { sleep(1000); } catch (InterruptedException e) { } yield(); System.out.println(sTname); } } }
结果:
one
one
two
two
注意sleep(1000)方法依然起作用,结果是1秒显示一个。
相关推荐
本实例"商业编程-源码-Csharp实例78 Thread例子1"将深入探讨如何使用C#进行多线程编程,以及线程在实际商业应用中的作用和注意事项。 首先,让我们了解线程的基本概念。在计算机系统中,进程是资源分配的最小单位,...
本实例“商业编程-源码-Csharp实例82 Thread例子3.zip”就是对C#线程(Thread)的深入探讨,通过实际代码来演示其工作原理和用法。 C#中的`System.Threading.Thread`类是创建和管理线程的基础,它提供了创建新线程...
本示例"商业编程-源码-Csharp实例81 Thread例子2"着重于如何理解和应用C#中的线程技术,这对于开发多任务并行运行的应用程序至关重要。线程允许程序在执行过程中同时进行多个不同的操作,极大地提高了效率,尤其是在...
一个线程经典例子 Thread delegate void SetProgressBarValueDele(); void SetProgressBarValue() { if (this.progressBar1.InvokeRequired) { this.Invoke(new SetProgressBarValueDele...
threadsample官方例子是一个宝贵的教育资源,它可以帮助开发者系统地学习和实践多线程编程,理解线程的创建、管理、同步、通信以及并发问题的解决方案。通过深入研究这些示例,开发者可以提升自己的并发编程能力,更...
VB多线程各种例子Thread Factory 4(中文帮助文档)
在"CH579M-RT-THREAD点灯例子"中,我们主要关注的是如何利用RT-THREAD的API函数来控制CH579M的GPIO端口进行LED灯的开关操作。首先,我们需要配置GPIO端口作为输出模式,这通常涉及到设置端口方向寄存器。在RT-THREAD...
android developer->training->sending operations to multiple threads 的例子。demo的例子叫threadSample.zip。这个例子请结合官网文档看,对android多线程处理给出了一个解决方案,写的相当好。
C#例子代码 A0303_ThreadSafeC#例子代码 A0303_ThreadSafeC#例子代码 A0303_ThreadSafeC#例子代码 A0303_ThreadSafeC#例子代码 A0303_ThreadSafeC#例子代码 A0303_ThreadSafeC#例子代码 A0303_ThreadSafeC#例子代码 ...
这些例子可能涵盖了基本任务创建、同步机制的使用、消息传递、定时器操作等各种功能,通过实际运行和分析这些测试案例,开发者能够深入学习ThreadX的内部工作方式,以及如何有效地利用其功能来设计高效的嵌入式系统...
C#例子代码 A0300_ThreadC#例子代码 A0300_ThreadC#例子代码 A0300_ThreadC#例子代码 A0300_ThreadC#例子代码 A0300_ThreadC#例子代码 A0300_ThreadC#例子代码 A0300_ThreadC#例子代码 A0300_ThreadC#例子代码 A0300...
本教程将通过“vc6多线程例子程序,ThreadSample”来深入理解这一概念。 VC6是Visual C++ 6.0的简称,是一款由微软公司开发的老版C++集成开发环境。尽管它已经过时,但对于初学者来说,它仍然是学习Windows API和多...
C#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#例子代码 A0301_ThreadAbortC#...
RT Thread 是一个开源、实时性优秀的嵌入式操作系统,它为物联网设备提供了高效、轻量级的多任务调度和丰富的中间件服务。在STM32F429这样的微控制器上,RT Thread 可以充分利用其强大的处理能力,提供丰富的功能,...
在第一个例子中,我们将继承 Thread 类来创建一个多线程类 TestThread。 ```java public class ThreadDemo { public static void main(String[] args) { new TestThread().start(); while(true) { System.out....
10. **应用示例**:通过具体的例子,如LED闪烁、串口通信、温湿度传感器读取等,了解如何将理论知识应用到实际项目中。 这个压缩包中的文件应包含了源代码、工程配置文件、Makefile、README文档等,通过阅读和分析...
复制代码 代码如下:# encoding: UTF-8import threadimport time# 一个用于在线程中执行的函数def func(): for i in range(5): print ‘func’ time.sleep(1) # 结束当前线程 # 这个方法与thread.exit_thread()...
`Thread`类是Java中的核心类,它允许我们创建并控制独立的执行线程。在这个实例中,我们将深入探讨如何使用`Thread`类创建和管理多线程。 1. **线程的基本概念** - **线程**:线程是程序执行的最小单元,一个进程...
5. **applications**目录:应用程序目录存放了示例代码或者用户开发的应用,用户可以通过查看和运行这些例子来学习如何在RT-Thread上编写应用程序。 6. **kernel-sample-0.1.0**:这个可能是内核样本代码,用户可以...
### 例子1:后台线程(Background Thread) 在C#中,可以通过`System.Threading.Thread`类创建一个新的线程。以下是一个简单的后台线程示例: ```csharp using System; using System.Threading; class Program { ...