ParameterizedThreadStart task[通俗易懂]

ParameterizedThreadStart task[通俗易懂]usingSystem;usingSystem.Diagnostics;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceAsyncAwait{classProgram{//http://www.cnblogs.com/sheng-jie/p/6471986.html…

大家好,又见面了,我是你们的朋友全栈君。

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncAwait
{

class Program
{

//http://www.cnblogs.com/sheng-jie/p/6471986.html
// 3.3. 什么是前台线程
// 默认情况下,使用Thread.Start()方法创建的线程都是前台线程。前台线程能阻止应用程序的终结,只有所有的前台线程执行完毕,CLR才能关闭应用程序(即卸载承载的应用程序域)。前台线程也属于工作者线程。

//3.4. 什么是后台线程
// 后台线程不会影响应用程序的终结,当所有前台线程执行完毕后,后台线程无论是否执行完毕,都会被终结。一般后台线程用来做些无关紧要的任务(比如邮箱每隔一段时间就去检查下邮件,天气应用每隔一段时间去更新天气)。后台线程也属于工作者线程。

static void Main(string[] args)
{

//C# async关键字用来指定某个方法、Lambda表达式或匿名方法自动以异步的方式来调用。
Console.WriteLine(“主线程启动,当前线程为:” + Thread.CurrentThread.ManagedThreadId);
var task = GetLengthAsync();

Console.WriteLine(“回到主线程,当前线程为:” + Thread.CurrentThread.ManagedThreadId);

Console.WriteLine(“线程【” + Thread.CurrentThread.ManagedThreadId + “】睡眠5s:”);
Thread.Sleep(5000); //将主线程睡眠5s

var timer = new Stopwatch();
timer.Start(); //开始计算时间

Console.WriteLine(“task的返回值是” + task.Result);

timer.Stop(); //结束点,另外StopWatch还有Reset方法,可以重置。
Console.WriteLine(“等待了:” + timer.Elapsed.TotalSeconds + “秒”);//显示时间

Console.WriteLine(“主线程结束,当前线程为:” + Thread.CurrentThread.ManagedThreadId);

//Console.WriteLine(“主线程开始!”);

//ForeBackGround();
//ThreadPoolTest();
Console.ReadKey();
}

private static async Task<int> GetLengthAsync()
{

Console.WriteLine(“GetLengthAsync()开始执行,当前线程为:” + Thread.CurrentThread.ManagedThreadId);

var str = await GetStringAsync();

Console.WriteLine(“GetLengthAsync()执行完毕,当前线程为:” + Thread.CurrentThread.ManagedThreadId);

return str.Length;
}

private static Task<string> GetStringAsync()
{

Console.WriteLine(“GetStringAsync()开始执行,当前线程为:” + Thread.CurrentThread.ManagedThreadId);
return Task.Run(() =>
{

Console.WriteLine(“异步任务开始执行,当前线程为:” + Thread.CurrentThread.ManagedThreadId);

Console.WriteLine(“线程【” + Thread.CurrentThread.ManagedThreadId + “】睡眠10s”);
Thread.Sleep(10000); //将异步任务线程睡眠10s

return “GetStringAsync()执行完毕”;

});

}

public static void TaskDemo2()
{

Console.WriteLine(“主线程ID:” + Thread.CurrentThread.ManagedThreadId);
Task.Run(() => Console.WriteLine(“Task对应线程ID:” + Thread.CurrentThread.ManagedThreadId));
Console.ReadLine();
}

public static void TaskDemo()
{

Console.WriteLine(“主线程ID:” + Thread.CurrentThread.ManagedThreadId);

Task.Factory.StartNew(() => Console.WriteLine(“Task对应线程ID:” + Thread.CurrentThread.ManagedThreadId));
Console.ReadKey();
}

/// <summary>
/// ThreadPool(线程池)
/// </summary>
public static void ThreadPoolTest()
{

WaitCallback workItem = state => Console.WriteLine(“当前线程Id为:” + Thread.CurrentThread.ManagedThreadId);

for (int i = 0; i < 10; i++)
{

ThreadPool.QueueUserWorkItem(workItem);
}

}

/// <summary>
/// 前台线程、后台线程
/// </summary>
private static void ForeBackGround()
{

//创建前台工作线程
Thread t1 = new Thread(Task1);
t1.Start();

//创建后台工作线程
Thread t2 = new Thread(new ParameterizedThreadStart(Task2));
t2.IsBackground = true; //设置为后台线程
t2.Start(“传参”);
}

private static void Task1()
{

Thread.Sleep(1000); //模拟耗时操作,睡眠1S
Console.WriteLine(“前台线程被调用!”);
}

private static void Task2(object data)
{

Thread.Sleep(2000); //模拟耗时操作,睡眠2S
Console.WriteLine(“后台线程被调用!” + data);
}

}
}

转载于:https://www.cnblogs.com/Jeely/p/11001736.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159614.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • jar包下载(全)

    jar包下载(全)转自:https://blog.csdn.net/meow_meow/article/details/78584696显示不出来请点击阅读更多作为初学者很多jar包不知道去哪里下载,给大家分享一个地址:这个网址是maven仓库的国内镜像地址:http://mvnrepository.com步骤图解:1.2.3….

    2022年5月15日
    101
  • ssh登录linux

    ssh登录linux2018-9-6上一篇提到用ssh登录centos好处很多,许多linux系统管理员都在用ssh。在windows下ssh客户端主要有puTTY、Xshell、secureCRT、sshsecureshell。linux下有openssh,这是个命令行工具。这篇主要将puTTY和Xshell的使用。puTTYpuTTY是开源免费软件。放恶意软件,建意到官网下载,或者百度、360、搜…

    2025年7月5日
    2
  • java notifyall_notify的用法

    java notifyall_notify的用法作者:知乎用户链接:https://www.zhihu.com/question/37601861/answer/145545371来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。今天正好碰到这个问题,也疑惑了好久。看了一圈知乎上的答案,感觉没说到根上。所以自己又好好Google了一下,终于找到了让自己信服的解释。先说两个概念:锁池和等待池锁池:假设线程A已经拥有了某…

    2025年10月9日
    4
  • Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

    Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】一 讲故事看完官方文档 阅读了一些 Newtonsoft 源码 对它有了新的认识 先总结六个超经典又实用的特性 同大家一起分享 废话不多说 快来一起看看吧 二 特性分析 1 代码格式化如果你直接使用 JsonConvert SerializeObj 的话 默认情况下所有的 json 是挤压在一块的 特别不方便阅读 如下所示 staticvoidMa string args varreportMod

    2025年9月3日
    3
  • vim常用命令详解(vim使用教程)

    目录本文解读来自我对manvim的解读vim介绍vim基本操作打开文件options详解vim的五种模式(是我自己定义的五种)正常模式必要命令详解末行模式常用命令详解可视模式常用命令详解本文解读来自我对manvim的解读当然有很多解读不准确的地方,所有红色标注的地方都是最基本的,也是保证正确的。(不排除我的语言描述有问题)vim介绍vim…

    2022年4月11日
    84
  • idea如何进行debug调试_idea debug怎么用

    idea如何进行debug调试_idea debug怎么用远程调试,特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用。JAVA支持调试功能,本身提供了一个简单的调试工具JDB,支持设置断点及线程级的调试同时,不同的JVM通过接口的协议联系,本地的Java文件在远程JVM建立联系和通信。此篇是IntellijIDEA远程调试的教程汇总和原理解释,知其然而又知其所以然。本机IntellijID…

    2025年10月25日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号