多线程是什么

多线程是什么,第1张

线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。

在计算机编程中,一个基本的概念就是同时对多个任务加以控制。许多程序设计问题都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主进程。可以通过多种途径达到这个目的。最开始的时候,那些掌握机器低级语言的程序员编写一些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。中断对那些实时性很强的任务来说是很有必要的。但对于其他许多问题,只要求将问题划分进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求 。

最开始,线程只是用于分配单个处理器的处理时间的一种工具。但假如 *** 作系统本身支持多个处理器,那么每个线程都可分配给一个不同的处理器,真正进入“并行运算”状态。从程序设计语言的角度看,多线程 *** 作最有价值的特性之一就是程序员不必关心到底使用了多少个处理器。程序在逻辑意义上被分割为数个线程;假如机器本身安装了多个处理器,那么程序会运行得更快,毋需作出任何特殊的调校。根据前面的论述,大家可能感觉线程处理非常简单。但必须注意一个问题:共享资源!如果有多个线程同时运行,而且它们试图访问相同的资源,就会遇到一个问题。举个例子来说,两个线程不能将信息同时发送给一台打印机。为解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状态。所以一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源。

根据线程名称找到线程,在java中是可以实现的,实现步骤是:

1、首先获取Java VM中当前运行的所有线程

以下代码是用数组返回Java VM中当前运行的所有线程

public static Thread[] findAllThreads()

{

    ThreadGroup group = ThreadcurrentThread()getThreadGroup();

    ThreadGroup topGroup = group;

    / 遍历线程组树,获取根线程组 /

    while ( group != null )

    {

        topGroup    = group;

        group        = groupgetParent();

    }

    / 激活的线程数加倍 /

    int estimatedSize = topGroupactiveCount()  2;

    Thread[] slackList = new Thread[estimatedSize];

    / 获取根线程组的所有线程 /

    int actualSize = topGroupenumerate( slackList );

    / copy into a list that is the exact size /

    Thread[] list = new Thread[actualSize];

    Systemarraycopy( slackList, 0, list, 0, actualSize );

    return (list);

}

2、遍历线程,比对名称,找到需要寻找的线程

以下代码可得到线程的名称

String name = threadgetName();

实现Runnable接口创建线程的步骤如下:

1定义一个类,实现Runnable接口。

public class MyRunnable implements Runnable {

// 线程执行体

@Override

public void run() {

// 提示线程名称等相关信息

Systemoutprintln("线程名称:" + ThreadcurrentThread()getName());

Systemoutprintln("线程ID:" + ThreadcurrentThread()getId());

Systemoutprintln("线程状态:" + ThreadcurrentThread()getState());

}

}

2、创建Runnable接口实现类的实例。

MyRunnable runnable = new MyRunnable();

3、创建Thread类的实例,并将Runnable接口实现类的实例作为参数传递给Thread类的构造方法。

Thread thread = new Thread(runnable);

4、调用Thread类的start()方法启动线程。

threadstart();

在线程内提示线程名称等相关信息,可以在Runnable接口实现类的run()方法中使用Thread类的currentThread()方法来获取当前线程的信息,然后通过getName()、getId()和getState()方法来获取线程名称、线程ID和线程状态,并打印到控制台。

public class Main {    public static void main(String[] args) {    

// 创建Runnable接口实现类的实例

     

MyRunnable runnable = new MyRunnable();    

// 创建Thread类的实例,并将Runnable接口实现类的实例作为参数传递给Thread类的构造方法

Thread thread = new Thread(runnable);

// 调用Thread类的start()方法启动线程

threadstart();

}

}

class MyRunnable implements Runnable {

// 线程执行体

@Override

public void run() {

// 提示线程名称等相关信息

Systemoutprintln("线程名称:" + ThreadcurrentThread()getName());

Systemoutprintln("线程ID:" + ThreadcurrentThread()getId());

Systemoutprintln("线程状态:" + ThreadcurrentThread()getState());

}

}

楼主可能对多线程还不是很熟悉。首先要处理大量数据必须放到除主线程外的其他工作线程中来处理,这样才能响应界面的点击、刷新、更新进度条等等。也就是说主线程是用来创建窗体、更新窗体等用户界面 *** 作的。

下面是转载的别人的,这样的资料太多了,其实仔细看看资料,其实很简单。

参考资料里面的内容很详细。

一、线程简介

通常C# 程序具有一个线程。这个线程从 Main方法的执行开始启动到Main方法的执行结束时线程终止。Main 直接或间接执行的每一个命令都由默认线程(或主线程)执行,当 Main 返回时此线程也将终止。不过,可以创建辅助线程,以便与主线程一起并行执行代码。这些线程通常称为“辅助线程”。

辅助线程可以用于执行耗时较多的任务或时间要求紧迫的任务,而不必占用主线程。例如,辅助线程经常用在服务器应用程序中,以便无需等待前面的请求完 成即可响应传入的请求。辅助线程还可用于在桌面应用程序中执行“后台”任务,以便使主线程(用于驱动用户界面元素)保持对用户 *** 作的响应。

多线程处理解决了吞吐量和响应性的问题,但同时也带来了资源共享问题,如死锁和争用状态。多线程特别适用于需要不同资源(如文件句柄和网络连接)的任务。为单个资源分配多个线程可能会导致同步问题,线程会被频繁阻止以等待其他线程,从而与使用多线程的初衷背道而驰。

常见的策略是使用辅助线程执行不需要大量占用其他线程所使用的资源的、耗时较多的任务或时间要求紧迫的任务。实际上,程序中的某些资源必须由多个线程访问。考虑到这些情况,SystemThreading 命名空间提供了用于同步线程的类。这些类包括 Mutex、Monitor、Interlocked、AutoResetEvent 和 ManualResetEvent。

您可以使用这些类中的部分或所有类来同步多个线程的活动,但是某些多线程处理支持由 C# 语言提供。例如,C# 中的 Lock 语句通过隐式使用 Monitor 来提供同步功能。

二、线程的生命周期

三、与线程有关的类

与C#有关的类都在SystemThreading命名空间中, SystemThreading 命名空间提供一些使得可以进行多线程编程的类和接口。除同步线程活动和访问数据的类(Mutex、Monitor、Interlocked、AutoResetEvent 等)外,此命名空间还包含一个 ThreadPool 类(它允许用户使用系统提供的线程池)和一个 Timer 类(它在线程池线程上执行回调方法)。

1 Thread: 创建并控制线程,设置其优先级并获取其状态。其中最常用的几个方法如下:

Sleep():将当前线程阻塞指定的毫秒数。

Abort():在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。

Join():阻塞调用线程,直到某个线程终止时为止。

Start():使线程得以按计划执行。

注意Suspend()为挂起线程和Resume()为继续挂起的线程,这两个方法存在风险,所以不建议使用。具体请参照MS的相关文档

Thread类的常用属性如下:

CurrentThread: 获取当前正在运行的线程。

IsAlive: 获取一个值,该值指示当前线程的执行状态。

Name: 获取或设置线程的名称

Priority:获取或设置一个值,该值指示线程的调度优先级。

ThreadState:获取一个值,该值包含当前线程的状态。

2 ThreadPool:提供一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。

BindHandle:将 *** 作系统句柄绑定到 ThreadPool。

GetAvailableThreads:检索由 GetMaxThreads 方法返回的最大线程池线程数和当前活动线程数之间的差值。

GetMaxThreads: 检索可以同时处于活动状态的线程池请求的数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用

GetMinThreads: 检索线程池在新请求预测中维护的空闲线程数。

QueneUserWorkItem: 将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。

RegisterWaitForSingleObject: 注册正在等待 WaitHandle 的委托。

UnsafeQueueUserWorkItem: 注册一个等待 WaitHandle 的委托。

SetMaxThreads: 设置可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。

四、示例及其说明

using System;

using SystemThreading;

public class Worker

{

// 在线程启动时此方法将被调用

public void DoWork()

{

while (!_shouldStop) // 如果线程正在运行则打印信息

{

ConsoleWriteLine("worker thread: working");

}

ConsoleWriteLine("worker thread: terminating gracefully");

}

public void RequestStop()

{

_shouldStop = true;

}

// Volatile这个关键字用来提醒编译器这个数据成员将被多线程访问

private volatile bool _shouldStop; // 应该停止

}

public class Program

{

static void Main()

{

// 创建一个线程对象 这里并不是线程的开始

Worker workerObject = new Worker();

// 这里定义一个新的线程,注意这里没有使用ThreadStart委托

// 另外构造函数接受的是对象的方法的名称

Thread workerThread = new Thread(workerObjectDoWork);

// 这里才是线程的真正开始

workerThreadStart();

ConsoleWriteLine("主线程: worker线程开始");

// 循环直到线程被激活,Thread的IsAlive这个属性表示线程是否为活动的

while (!workerThreadIsAlive);

// 将主线程暂停1毫秒,以允许worker这个线程完成自己的工作

ThreadSleep(1);

// 需要worker这个线程自动停止

workerObjectRequestStop();

// 使用Join这个方法来阻塞当前线程,直到对象的线程终止 workerThreadJoin();

ConsoleWriteLine("main thread: Worker thread has terminated");

}

}

ps命令用于查看系统中的进程状态,格式为:“ps [参数]”,同样搭配的参数如下:

当您第一次执行这个命令时估计要惊呆下,这么多输出值怎么看的过来?其实平常我们会将ps命令与管道符来结合使用,用于来抓取到某个指定服务进程所对应的PID号码,而常见的ps命令参数包括有:

参数 作用

-a 显示所有的进程(包括其他用户的)

-u 用户以及其他详细信息

-x 显示没有控制终端的进程

以上就是关于多线程是什么全部的内容,包括:多线程是什么、java 根据线程名字查询一个线程,能实现吗、简答题实现runnable接口创建线程并在线程内提示线程名称等相关信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9640026.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存