引用
一、什么是线程
线程是一个程序内部的顺序控制流。
线程和进程
1. 进程:每个进程都有独立的代码和数据空间,进程切换开销大。
2. 线程:轻量的进程,同一个线程共享代码和数据空间,每个线程有独立运行的栈和程序计数器(PC),线程切换的开销小。
3. 在操作系统中能同时运行多个任务(程序)。
4. 在同一应用程序有多个顺序流同时执行。
问题:对于单核的CPU,处理多个任务时。并不会同时真正的运两个以上的程序。那么它是怎样做到处理多任务的呢?
解答:实际上是操作系统负责对处理器就是CPU等资源进行分配组织和管理。实际上每一时刻只能做一件事,或者运行某一个程序。由于在操作系统的管理下,CPU的处理功能被以非常小的时间间隔进行划分、进行交替,每一个小的时间间隔我们称为时间片。当时间片到期之后将去执行下一个程序。由于交替的速度非常的快,这样就给人一种同时运行多个应用程序或者同时做多件事的一种感觉。这种情况我们称为并发执行。也就是假的,模拟的,通过快速的交替,表现成在同时做多件事。
并行执行才是真正意义上的同一时刻做多个事情,同一个瞬间运行不同的应用程序。这样就要求有多个CPU。支持程序并发运行的操作系统我们称为多任务的操作系统或者说是多进程的操作系统。
并发性的工作原理还可以应用在更高的层面上,我们可以在一个应用程序的内部,把它要完成的任务分解为多个更小的子任务以多条齐头并进的线索来并发的执行,这种就称为线程或多线程。
二、线程的概念模型
Java语言实现或支持多线程的工作方式。
一个线程必须具备以下三方面的要素才能正常的工作。
1. 虚拟的CPU,由java.lang.Thread类封装和虚拟。
2. CPU所执行的代码,传递给Thread类的对象。
3. CPU所处理的数据,传递给Thread类的对象。
三、创建线程
第一种方式:使用Runnable接口创建线程
1. Java的线程是通过java.lang.Thread类来实现。
2. 每个线程都是通过某个特定的Thread对象所对应的run()方法来完成其操作。方法run()称为线程体。
例1:
public class Thread1{
public static void main(String[] args){
Runner1 r=new Runner1();//2.创建实现Runnable接口的对象
Thread t=new Thread(r); //3.创建一个Thread类的对象
t.start(); //4.启动线程
}
}
class Runner1 implements Runnable{//1.Runner1实现Runnable接口
public void run(){
for(int i=1;i<20;i++){
System.out.println(i);
}
}
}
程序运行的结果是输出1到19个数字。与在main()方法中直接写for循环是一样的效果。
但实现的原理不一样。
使用线程输出的有两个线程(main()主线程和t子线程),不使用只有一个线程。
创建线程的三个步骤
1. 定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
2. 创建Runnable接口实现类的对象。
3. 创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象。(接口可以实现多继承)
4. 调用Thread对象的start()方法,启动线程
第二种方式:直接继承Thread类创建对象
例2:
public class Thread2{
public static void main(String[] args){
Thread t=new Runner2();
t.start();
}
}
class Runner2 extends Thread{
public void run(){
for(int i=1;i<20;i++){
String s=Thread.currentThread().getName();
System.out.println(s+":"+i);
}
}
}
1.首先定义一个类去继承Thread父类,此时Runner2类并没有直接的实现Runnable接口,但其实Thread类在JDK中已经实现了Runnable接口。这样就Runner2类间接的实现了Runnable接口。重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
2.直接创建一个Runner2类的对象,也可以利用多态性,变量t声明为父类的类型。
3.线程t启动,隐含的调用run()方法。
比较两种方式:
a.使用Runnable接口创建线程
1.可以将CPU,代码和数据分开,形成清晰的模型
2.线程体run()方法所在的类可以从其它类中继承一些有用的属性和方法
3.有利于保持程序的设计风格一致
b.直接继承Thread类创建对象
1.Thread子类无法再从其它类继承(java语言的单继承)。
2.编写简单,run()方法的当前对象就是线程对象,可直接操作。
分享到:
相关推荐
1.方式1:继承 QThread 类方式:...两种方式的选择取决于具体的需求和设计。仅需简单的线程操作,继承 QThread 类方式可能更为简洁。如果需要更灵活的线程控制和对象交互,使用类对象的 moveToThread() 方式可能更适合
在Java中,创建和使用线程主要有两种方式,一种是继承Thread类,另一种是实现Runnable接口。这两种方式在使用上有一些区别,每种方式都有其特定的用法和特点。 首先,继承Thread类的方式。通过继承Thread类来创建...
Java提供了两种主要的方法来创建线程,分别是直接继承自`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景。 1. **继承Thread类**: 当你选择继承`Thread`类时,你需要创建一个新的类,该类直接...
在这个例子中,有两种方式实例化并启动`MyThread`: 1. **代码①**:`MyThread thread = new MyThread();` 这行代码创建了一个`MyThread`对象,但是没有立即启动线程。为了启动线程,需要调用`start()`方法,如`...
Java多线程编程中,创建线程主要有两种方式:继承`Thread`类和实现`Runnable`接口。这两种方式虽然都能实现多线程,但它们在实际应用中有着不同的特性和适用场景。 首先,我们来看看继承`Thread`类的方式。这种方式...
在操作系统中,线程分为两种状态:可结合的(joinable)和分离的(detached)。理解这两种状态及其差异对于有效管理线程资源至关重要。 可结合线程是默认状态,意味着在创建线程后,父线程需要通过调用`pthread_...
在VC++中,创建线程主要有两种方法:使用Windows API函数和使用C++标准库中的`std::thread`。 1. **使用Windows API函数创建线程** 在Windows API中,可以使用`CreateThread`函数来创建新的线程。首先,你需要...
标题提到的"创建线程的两种方法"指的是使用`Thread`类和实现`Runnable`接口。这两种方法都是Java中实现多线程的重要手段,各有特点和适用场景。下面我们将详细探讨这两种方法。 **1. 继承Thread类** 当一个类继承...
2. **消息驱动的线程**:另一种方式是基于消息循环的线程,线程的主要工作是处理由消息队列分发的消息。这种方式适用于那些需要响应用户输入或其他事件的情况,如GUI应用程序。在易语言中,你可以使用“启动消息线程...
`ThreadProject`可能是包含多个Java文件的项目,这些文件展示了如何通过上述两种方式实现多线程。你可以通过运行这些示例来更好地理解和学习Java多线程的概念。例如,它可能包含一个继承`Thread`的类,一个实现`...
创建线程主要有两种方式:一是通过系统调用来创建,比如在POSIX系统中使用`pthread_create`函数;二是通过语言支持,如Java中的`Thread`类或C#的`Thread`类。在给定的描述中,提到的是在VC6.0环境下实现,这意味着...
在C#中,线程池和Thread类是两种常用的线程创建和管理方式。 一、线程池(ThreadPool) 线程池是一个容纳线程的容器,一个应用程序最多只能有一个线程池。ThreadPool是一个静态类,通过QueueUserWorkItem()方法将...
这两种方式各有优缺点,适用于不同的场景。 ### 继承Thread类 当你选择继承`Thread`类来创建线程,你需要按照以下步骤操作: 1. 创建一个新的类,该类继承自`Thread`类。 2. 重写`Thread`类中的`run()`方法,这个...
首先,让我们了解这两种方式的基本概念: 1. **继承Thread类**:这是创建多线程的直接方式,通过创建一个新的类,该类继承自`Thread`类,然后重写`run()`方法。创建线程时,只需要创建该子类的实例并调用`start()`...
Java 语言还提供了另一种方式来创建线程,即通过实现 Runnable 接口。在上面的代码中,我们定义了一个 T1 类,该类实现了 Runnable 接口,并覆盖了 run 方法。在 run 方法中,我们使用 while 循环来不断地调用 ...
事件对象有两种状态:有信号(Signaled)和无信号(Unsignaled)。当事件为有信号状态时,等待该事件的线程可以继续执行。事件有手动重置和自动重置两种类型。手动重置事件在释放一个等待线程后仍保持有信号状态,...
在Java中,创建线程有以下两种方法: 1. 继承Thread类:创建一个新的类,该类继承自`java.lang.Thread`,然后重写`run()`方法。实例化这个新类的实例后,通过调用`start()`方法来启动线程。 ```java class ...
本篇文章将深入探讨如何在易语言中通过两种不同的方法传递文本参数到线程中。 ### 方法一:使用线程创建时传递参数 易语言中,我们可以通过在创建线程时直接传递参数来实现。具体步骤如下: 1. **定义线程函数**...
总结来说,易语言提供了“创建线程”和“启动进程”两种多线程实现方式,分别适用于不同场景。学习和掌握这些方法,对于易语言的开发者来说,是提高程序性能和解决复杂问题的重要技能。结合提供的源码,我们可以更...
- 这两个宏允许动态创建线程对象,使得可以在运行时实例化线程类。 - **步骤3:创建线程对象** - 使用 `AfxBeginThread()` 函数创建线程对象,传递线程类的指针和线程优先级等参数。 - **步骤4:线程同步** -...