写道
package com.mywork.xz;
public class LiftOff implements Runnable {
protected int countDown = 10;// Default,倒数计数
/**
* 线程计数,java 中,当声明一个事物是static时, 表示这个事物,不会与包含它的那个类的对象关联
* 在一起,而是属于这个类。jvm中,执行new 创建 对象时,数据的存储空间才被分配。而static在 类被加载是就已经被执行了。
*/
private static int taskCount = 0;
private final int id = taskCount++;// 线程ID
public LiftOff() {
};
public LiftOff(int countDown) {
this.countDown = countDown;
}
public String status() {
return "#" + id + "(" + (countDown > 0 ? countDown : "LiftOff!") + ")";
}
public void run() {
while (countDown-- > 0) {
System.out.print(status());
Thread.yield();
}
}
}
public class LiftOff implements Runnable {
protected int countDown = 10;// Default,倒数计数
/**
* 线程计数,java 中,当声明一个事物是static时, 表示这个事物,不会与包含它的那个类的对象关联
* 在一起,而是属于这个类。jvm中,执行new 创建 对象时,数据的存储空间才被分配。而static在 类被加载是就已经被执行了。
*/
private static int taskCount = 0;
private final int id = taskCount++;// 线程ID
public LiftOff() {
};
public LiftOff(int countDown) {
this.countDown = countDown;
}
public String status() {
return "#" + id + "(" + (countDown > 0 ? countDown : "LiftOff!") + ")";
}
public void run() {
while (countDown-- > 0) {
System.out.print(status());
Thread.yield();
}
}
}
写道
package com.mywork.xz;
public class MainThread {
public static void main(String[] args) {
for(int i=0;i<5;i++){
new LiftOff().run();
}
System.out.println("------");
for(int i=0;i<5;i++){
new Thread(new LiftOff()).start();
}
}
}
public class MainThread {
public static void main(String[] args) {
for(int i=0;i<5;i++){
new LiftOff().run();
}
System.out.println("------");
for(int i=0;i<5;i++){
new Thread(new LiftOff()).start();
}
}
}
输出结果:
前一个for循环:
#0(9)#0(8)#0(7)#0(6)#0(5)#0(4)#0(3)#0(2)#0(1)#0(LiftOff!)
#1(9)#1(8)#1(7)#1(6)#1(5)#1(4)#1(3)#1(2)#1(1)#1(LiftOff!)
#2(9)#2(8)#2(7)#2(6)#2(5)#2(4)#2(3)#2(2)#2(1)#2(LiftOff!)
#3(9)#3(8)#3(7)#3(6)#3(5)#3(4)#3(3)#3(2)#3(1)#3(LiftOff!
)#4(9)#4(8)#4(7)#4(6)#4(5)#4(4)#4(3)#4(2)#4(1)#4(LiftOff!)
后一个for循环
#5(9)#5(8)#7(9)#5(7)#7(8)#5(6)#7(7)#6(9)#9(9)#8(9)#6(8)#8(8)#6(7)#8(7)#6(6)#8(6)#6(5)#8(5)#6(4)#8(4)#6(3)#8(3)#6(2)#8(2)#6(1)
#8(1)#6(LiftOff!)#8(LiftOff!)#5(5)#7(6)#7(5)#7(4)#7(3)#7(2)#7(1)#7(LiftOff!)#9(8)#5(4)#9(7)#5(3)#9(6)#5(2)#9(5)#5(1)#9(4)#5(LiftOff!)
#9(3)#9(2)#9(1)#9(LiftOff!)
可见,run方法并无特殊之处,他不会产生任何内在的线程能力,要实现线程行为,你必须显示的将一个任务附着到线程上。
相关推荐
创建一个新线程通常有两种方式:继承Thread类并重写run()方法,或者实现Runnable接口并提供run()方法。在run()方法中编写线程执行的代码。 进度条通常由主线程负责显示,而耗时任务则在一个或多个工作线程中执行。...
另一种方式是实现`Runnable`接口,这种方式不涉及继承问题,更灵活。 ```java class MyRunnable implements Runnable { public void run() { // 在这里编写线程执行的代码 } } Thread thread = new Thread(new ...
Java编程中的线程动画是一种利用多线程技术在图形用户界面(GUI)上实现动态效果的方法。线程是操作系统分配CPU时间的基本单元,Java通过提供Thread类和Runnable接口支持线程编程。理解线程动画首先需要掌握Java线程...
Java多线程是Java语言的一个重要特性,它为开发者提供了一种高效地利用计算机资源的方式。通过合理的设计和实现,多线程可以让Java程序变得更加高效和灵活。然而,多线程编程也有其复杂性和挑战性,开发者需要对线程...
- **实现Runnable接口**:另一种方式是实现`Runnable`接口并覆盖`run()`方法,然后将其实例传递给`Thread`构造函数。 - **使用Callable和Future**:对于需要返回结果的线程,可以使用`Callable`接口代替`Runnable`。...
Java提供了多种创建线程的方式,如继承Thread类和实现Runnable接口。线程间通信主要依赖于同步机制,包括synchronized关键字、wait()、notify()和notifyAll()方法。此外,Java还提供了线程的状态模型(新建、就绪、...
在Java中,线程是程序执行的最小单位,而创建线程主要有两种方式:继承Thread类和实现Runnable接口。本项目是一个Java小游戏,核心功能是键盘打字练习,允许用户根据屏幕显示的字符进行快速输入,以提升打字速度,...
Java多线程网络爬虫是一种高效地从互联网上抓取数据的技术,特别是在处理大量网页时,多线程能显著提高爬虫的效率。本项目以时光网(Mtime)为例,展示如何使用Java实现这样的爬虫。时光网是一个提供电影、电视剧、...
观察者模式是软件设计模式中的一种,用于描述对象之间的一种一对多的依赖关系。观察者模式中有观察者(Observer)和被观察者(Subject),当被观察者发生了某些变化时,将变化通知观察者。 观察者接口: public ...
- 死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种僵局。为了避免死锁,需要合理设计线程间资源的分配和访问策略。 - 资源竞争主要是由于多个线程同时对同一个数据进行操作时,可能导致数据的不一致...
线程池是一种优化多线程应用的设计模式,通过复用预创建的线程来减少创建和销毁线程的开销。Java的`ExecutorService`接口和`ThreadPoolExecutor`类提供了创建和管理线程池的功能,有助于提高多线程程序的性能和效率...
Java作为一种广泛使用的编程语言,内置了对线程的支持,使得开发者能够轻松地实现多任务处理。本文将详细介绍Java线程的基础知识,包括线程的概念、线程的好处以及如何在Java程序中开始使用线程。 #### 二、线程...
- **实现Runnable接口**:另一种方式是实现`java.lang.Runnable`接口,然后创建一个`Thread`实例并传入实现类的对象。 ##### 4.2 控制线程 - **线程的生命周期**:线程从新建到死亡经历不同的状态,包括可运行状态...
在Java编程中,UDP(User Datagram Protocol)是一种无连接的传输层协议,常用于需要高效传输数据但不关心数据丢失或重复的场景。本程序利用Java的多线程技术实现了一个UDP的收发程序,这使得发送和接收数据可以在...
在Java编程中,多线程是一种常见的技术,用于提高程序的执行效率,特别是在处理大量并发任务时。在本项目“多线程页面析取源码”中,开发者使用了多线程来并行抓取网页内容,从而加速了数据获取过程。这个实现依赖于...
在Java或C#这样的多线程环境下,可以使用如`Thread`类或`ThreadPool`来创建和管理线程,也可以利用`Runnable`接口或`ThreadStart`委托定义线程的执行逻辑。线程间的通信可以通过`Monitor`、`Mutex`、`Semaphore`等...
Java是一种广泛使用的面向对象的编程语言,具有丰富的库和框架,可以方便地处理数据库操作和定时任务。在这个项目中,我们将重点关注两个关键部分:Java线程控制和定时任务。 1. **Java线程控制**:线程是Java中的...
Java线程机制是抢占式的,这意味着调度机制会周期性地中断线程,并将其上下文切换到另一个线程,这样每个线程都会被分配一个合理的执行时间来驱动其任务。这种机制使得线程之间的调度更加灵活。 **2. 线程同步** -...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、健壮性和安全性著称。这个"java实验"的压缩包显然提供了学习和实践Java基础及高级特性的资源,特别是关于文件操作、多线程以及图形用户界面(GUI)和网络编程...
在Java中,线程是一种轻量级进程,它与同一进程中的其他线程共享进程的资源(如内存),但有自己的堆栈和程序计数器。 **2. 进程与线程的区别** - **进程**:具有独立的地址空间和其他资源,进程间的切换开销较大...