介绍:通过pdf地址先将文件下载到本地,然后调用打印机打印,最后将下载的文件删除。

  环境:windows系统。(windows64位)

     windows系统中安装python3.6.2环境

  资料:

    O2S.Components.PDFRender4NET.dll(vs项目引用,这是在C#中调用打印机)

    python3.6.2 for windows python-3.6.2-amd64-webinstall

    在python环境中添加:pywin32-221.win-amd64-py3.6 和  GSPRINT文件(python环境中执行文件下载 打印 删除)

windows环境下安装python环境:

点击程序进行安装........

推荐安装教程:https://baijiahao.baidu.com/s?id=1606573927720991570&wfr=spider&for=pc

配置打印环境:

  首先进入cmd环境导入requests模块

  下载pywin32 官网https://sourceforge.net/projects/pywin32/

  

找准对应版本.....

或者是我提供的下载地址(我的是3.6.2python版本)

接下来就是安装了.....

然后在python环境中去测试一下

解压

将GSPRINT文件夹与上面win32的安装模块文件放在一起,如下:

后面文件中对应地址:

首先从C#代码开始

   界面预览:这个很简单,在wpf中可以写个button按钮事件即可

我直接贴出打印的核心代码:

  1. /* 由于质保书后台接口给的是pdf下载地址,所以我的思路是 先下载到本地然后打印,打印完成后在删除文件
  2. * 由于时间仓促:文件的下载及删除功能使用python来完成(这里也可以改为C#来写)
  3. *
  4. */
  5. try
  6. {
  7. // 1:文件下载
  8. var result = PythonHelper.PdfDownload(this.model.ZhiBaoShu.DownloadUrl);
  9. if (!result.Successed)
  10. {
  11. Dispatcher.Invoke(() =>
  12. {
  13. MessageBox.Show("pdf质保书下载失败,请联系管理员", "打印消息", MessageBoxButton.OK, MessageBoxImage.Stop);
  14. LogHelper.LogInfo($"文件:【{this.model.ZhiBaoShu.DownloadUrl}】下载失败\r\n 错误:\r\n{result.Message}");
  15. // 发生错误返回主页
  16. UtilHelper.BackToMain(this, mainPage.stpBG, () => { BackToMain(); }, null);
  17. });
  18. }
  19. Thread.Sleep(1000);
  20. _savePath = result.Result.ToString();
  21. // 2:打印下载pdf文件(python打印只能打印一份,还有打印样式未完善,所以还是用C#来调用打印)
  22. result = PythonHelper.PdfPrint(_savePath, model.ZhiBaoShu.PrinterName);
  23. // result = ph.PdfPrint(_savePath, model.ZhiBaoShu.PrinterName, (short)model.ZhiBaoShu.PrintNum);
  24. if (!result.Successed)
  25. {
  26. Dispatcher.Invoke(() =>
  27. {
  28. MessageBox.Show("pdf质保书打印失败,请联系管理员", "打印消息", MessageBoxButton.OK, MessageBoxImage.Stop);
  29. LogHelper.LogInfo($"文件:【{result.Result.ToString()}】打印失败\r\n 错误:\r\n{result.Message}");
  30. // 发生错误返回主页
  31. UtilHelper.BackToMain(this, mainPage.stpBG, () => { BackToMain(); }, null);
  32. });
  33. }
  34. Thread.Sleep(1000);
  35. //// 3:删除pdf文件
  36. //result = PythonHelper.PdfDelete(_savePath);
  37. //if (!result.Successed)
  38. //{
  39. // //MessageBox.Show("pdf质保书删除失败", "打印消息", MessageBoxButton.OK, MessageBoxImage.Stop);
  40. // LogHelper.LogInfo($"文件:【{this.model.ZhiBaoShu.DownloadUrl}】删除失败\r\n 错误:\r\n{result.Message}");
  41. // // 发生错误返回主页
  42. // //UtilHelper.BackToMain(this, mainPage.stpBG, () => { BackToMain(); }, null);
  43. // // 文件删除失败不代表打印失败,所以这里结果重置一下
  44. // result.Successed = true;
  45. //}
  46.  
  47. }
  48. catch (Exception e)
  49. {
  50.  
  51. }

 

pythonhelper.cs 文件 (代码未优化)

  1. /// <summary>
  2. /// 执行python文件
  3. /// </summary>
  4. public static class PythonHelper
  5. {
  6. /// <summary>
  7. /// 程序debug目录文件路径
  8. /// </summary>
  9. private static string _binPath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
  10.  
  11. /// <summary>
  12. /// 保存本地pdf文件名
  13. /// </summary>
  14. private static string _pdfName = DateTime.Now.ToString("HHmmss") + ".pdf";
  15.  
  16. /// <summary>
  17. /// 文件下载保存本地地址+文件名
  18. /// </summary>
  19. private static string _savePath = _binPath + "file\\" + _pdfName;
  20.  
  21. /// <summary>
  22. /// pdf下载
  23. /// </summary>
  24. /// <param name="downloadurl">pdf下载地址</param>
  25. /// <returns>返回保存文件地址</returns>
  26. public static HandlingResult PdfDownload(string downloadurl)
  27. {
  28. // python文件地址 ,待处理python文件的路径,本例中放在debug文件夹下
  29. string _pdfDownloadPy = _binPath + "python\\pdfdownload.py";
  30. var result = new HandlingResult() { Successed = false };
  31. try
  32. {
  33. // 拼接执行命令(方法传参)
  34. ArrayList arrayList = new ArrayList();
  35. arrayList.Add(downloadurl);
  36. arrayList.Add(_savePath);
  37. foreach (var param in arrayList)//添加参数
  38. _pdfDownloadPy += " " + param;
  39.  
  40. // 执行设置
  41. ProcessStartInfo start = new ProcessStartInfo();
  42. start.FileName = "python";//执行python.exe
  43. //执行python脚本的命令
  44. start.Arguments = _pdfDownloadPy;
  45. //设置运行python脚本的初始目录 这里注意:如果你的python脚本有文件操作,必须设置初始目录,python脚本所在的目录
  46. start.WorkingDirectory = _binPath + "python\\";
  47. start.UseShellExecute = false;
  48. start.CreateNoWindow = true;
  49. start.RedirectStandardOutput = true;
  50. start.RedirectStandardError = true;
  51. using (Process process = Process.Start(start))
  52. {
  53. // 异步获取命令行内容
  54. process.BeginOutputReadLine();
  55. // 为异步获取订阅事件
  56. process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
  57. {
  58. // 打印python脚本中的信息
  59. LogHelper.LogInfo(e.Data);
  60. //MessageBox.Show(e.Data);//e.Data 就是命令行打印的最后一行信息
  61. });
  62. }
  63. result.Successed = true;
  64. result.Result = _savePath;
  65. }
  66. catch (Exception e)
  67. {
  68. result.Successed = false;
  69. result.Message = e.Message;
  70. LogHelper.LogError(e);
  71.  
  72. }
  73.  
  74. return result;
  75. }
  76.  
  77. /// <summary>
  78. /// 删除pdf文件
  79. /// </summary>
  80. /// <param name="path">本地pdf文件全路径</param>
  81. public static HandlingResult PdfDelete(string path)
  82. {
  83. string _pdfDeletePy = _binPath + "python\\pdfdelete.py";
  84. var result = new HandlingResult() { Successed = true };
  85. try
  86. {
  87. // 拼接执行命令(方法传参)
  88. ArrayList arrayList = new ArrayList();
  89. arrayList.Add(path);
  90. foreach (var param in arrayList)//添加参数
  91. _pdfDeletePy += " " + param;
  92.  
  93. // 执行设置
  94. ProcessStartInfo start = new ProcessStartInfo();
  95. start.FileName = "python";//执行python.exe
  96. //执行python脚本的命令
  97. start.Arguments = _pdfDeletePy;
  98. //设置运行python脚本的初始目录 这里注意:如果你的python脚本有文件操作,必须设置初始目录,python脚本所在的目录
  99. start.WorkingDirectory = _binPath + "python\\";
  100. start.UseShellExecute = false;
  101. start.CreateNoWindow = true;
  102. start.RedirectStandardOutput = true;
  103. start.RedirectStandardError = true;
  104. using (Process process = Process.Start(start))
  105. {
  106.  
  107. // 异步获取命令行内容
  108. process.BeginOutputReadLine();
  109. // 为异步获取订阅事件
  110. process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
  111. {
  112. // 打印python脚本中的信息
  113. LogHelper.LogInfo(e.Data);
  114. //MessageBox.Show(e.Data);//e.Data 就是命令行打印的最后一行信息
  115. });
  116. }
  117.  
  118. }
  119. catch (Exception e)
  120. {
  121. result.Successed = false;
  122. result.Message = e.Message;
  123. }
  124. return result;
  125. }
  126.  
  127. /// <summary>
  128. /// 打印pdf
  129. /// </summary>
  130. /// <param name="printPath">文件全路径</param>
  131. /// <param name="printName">打印机名称</param>
  132. public static HandlingResult PdfPrint(string printPath, string printName)
  133. {
  134. string _pdfPrint = _binPath + "python\\pdfprint.py";
  135. var result = new HandlingResult() { Successed = true };
  136. try
  137. {
  138. // 拼接执行命令(方法传参)
  139. ArrayList arrayList = new ArrayList();
  140. arrayList.Add(printPath);
  141. arrayList.Add(printName);
  142. foreach (var param in arrayList)//添加参数
  143. _pdfPrint += " " + param;
  144.  
  145. // 执行设置
  146. ProcessStartInfo start = new ProcessStartInfo();
  147. start.FileName = "python";//执行python.exe
  148. start.Arguments = _pdfPrint;//执行python脚本的命令
  149. //设置运行python脚本的初始目录 这里注意:如果你的python脚本有文件操作,必须设置初始目录,python脚本所在的目录
  150. start.WorkingDirectory = _binPath + "python\\";
  151. start.UseShellExecute = false;
  152. start.CreateNoWindow = true;
  153. start.RedirectStandardOutput = true;
  154. start.RedirectStandardError = true;
  155. using (Process process = Process.Start(start))
  156. {
  157. // 异步获取命令行内容
  158. process.BeginOutputReadLine();
  159. // 为异步获取订阅事件
  160. process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
  161. {
  162. // 打印python脚本中的信息
  163. LogHelper.LogInfo(e.Data);
  164. //MessageBox.Show(e.Data);//e.Data 就是命令行打印的最后一行信息
  165. });
  166. }
  167. }
  168. catch (Exception e)
  169. {
  170. LogHelper.LogError(e);
  171. result.Successed = false;
  172. result.Message = e.Message;
  173. }
  174. return result;
  175. }
  176.  
  177. }

第二种调用打印机方法:使用第三方O2S.Components.PDFRender4NET.dll文件调用打印机打印pdf

  1. /// <summary>
  2. /// 打印pdf文件
  3. /// </summary>
  4. /// <param name="pdfPath">文件全路径</param>
  5. /// <param name="printName">打印机名称</param>
  6. /// <param name="copies">打印份数</param>
  7. /// <returns></returns>
  8. public HandlingResult PdfPrint(string pdfPath, string printName, short copies = 1)
  9. {
  10. PDFFile file =null;
  11. var result = new HandlingResult()
  12. {
  13. Successed = true,
  14. };
  15. try
  16. {
  17. file = PDFFile.Open(pdfPath);
  18. PrinterSettings settings = new PrinterSettings();
  19. System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();
  20. settings.PrinterName = printName; // "NPI84FFAF (HP LaserJet MFP M436)"; // 打印机名称
  21. settings.PrintToFile = false;
  22.  
  23. //设置纸张大小(可以不设置,取默认设置)3.90 in, 8.65 in
  24. PaperSize ps = new PaperSize("test", 4, 9);
  25. ps.RawKind = 9; //如果是自定义纸张,就要大于118,(A4值为9,详细纸张类型与值的对照请看http://msdn.microsoft.com/zh-tw/library/system.drawing.printing.papersize.rawkind(v=vs.85).aspx)
  26. O2S.Components.PDFRender4NET.Printing.PDFPrintSettings pdfPrintSettings =
  27. new O2S.Components.PDFRender4NET.Printing.PDFPrintSettings(settings);
  28. pdfPrintSettings.PaperSize = ps;
  29. pdfPrintSettings.PageScaling =
  30. O2S.Components.PDFRender4NET.Printing.PageScaling.FitToPrinterMarginsProportional;
  31. pdfPrintSettings.PrinterSettings.Copies = copies;
  32.  
  33. file.Print(pdfPrintSettings);
  34. }
  35. catch (Exception e)
  36. {
  37. LogHelper.LogError(e);
  38. result.Successed = false;
  39. result.Message = e.Message;
  40. }
  41. finally
  42. {
  43. file.Dispose();
  44. LogHelper.LogInfo($"{pdfPath}---打印成功");
  45. }
  46.  
  47. return result;
  48. }

  

以上是C#部分代码,以下python脚本就比较简单了。

注:其实可以只写一个打印方法即可,为了流程看到清楚,所以一个操作一个方法文件。

1:根据地址下载pdf文件 pdfdownload.py

  1. # -*- coding: utf-8 -*-
  2.  
  3. # 声明字符编码
  4. # coding:utf-8
  5. import os, sys
  6. from requests import get
  7. def dwnloadpfd(file_path, save_path):
  8. '''
  9. 根据file_path地址下载文件保存到save_path路径中
  10. :param file_path:下载地址
  11. :param save_path: 保存地址
  12. :return:True或False
  13. '''
  14. try:
  15. head = {
  16. "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36"
  17. }
  18. response =get(file_path, headers=head).content
  19. with open(save_path, 'wb') as f:
  20. f.write(response)
  21. print('%s--下载成功'%(save_path))
  22. return save_path
  23. except Exception as e:
  24. print(e)
  25. return None
  26.  
  27. if __name__ == "__main__":
  28. #url = ""
  29. #dwnloadpfd(url, "musics/1.pdf")
  30. # 接收参数
  31. dwnloadpfd(sys.argv[1], sys.argv[2])

  

2:打印pdf文件:pdfprint.py

  1. # -*- coding: utf-8 -*-
  2.  
  3. # 声明字符编码
  4. # coding:utf-8
  5. import os, sys
  6. import win32api
  7. import win32print
  8. import json
  9. from handlingresult import handlingresult
  10.  
  11. GHOSTSCRIPT_PATH = "C:\\Program Files\\gs\\gs9.27\\bin\\gswin64.exe"
  12. GSPRINT_PATH = "C:\\Program Files\\GSPRINT\\gsprint.exe"
  13.  
  14. def pdfprint(full_file_name, print_name=win32print.GetDefaultPrinter()):
  15. '''
  16. 根据指定的打印机打印pdf文件
  17. :param full_file_name:文件全路径
  18. :param print_name:打印机名称(默认打印机)
  19. :return:
  20. '''
  21. result = handlingresult()
  22. try:
  23. # portraint:纵向 landscape:横向
  24. win32api.ShellExecute(
  25. 0,
  26. 'open',
  27. GSPRINT_PATH,
  28. '-ghostscript "' + GHOSTSCRIPT_PATH + '" -landscape -printer "' + print_name + '" "' + full_file_name + '"',
  29. '.',
  30. 0
  31. )
  32. result.Message = '%s---打印成功' % (full_file_name)
  33. result.Result = None
  34. result.Successed = True
  35. except Exception as e:
  36. result.Message = '%s---打印异常:\n %s' % (full_file_name, str(e))
  37. result.Result = None
  38. result.Successed = False
  39. js = json.dumps(result, default=lambda obj: obj.__dict__, sort_keys=True, indent=4)
  40. return js
  41.  
  42. if __name__ == "__main__":
  43. path ="D:\\1.pdf" #"E:\\开发项目\\学习项目\\Python\\MusicDownLoad\\musics\\1.pdf"
  44. name = "NPIE091D5 (HP LaserJet MFP M227fdw)" # win32print.GetDefaultPrinter() # "NPI84FFAF (HP LaserJet MFP M436)" #
  45. print(pdfprint(path, name))
  46.  
  47. # len(sys.argv)
  48. # print(sys.argv[1]) # 文件路径
  49. # print(sys.argv[2:]) # 打印机名称
  50. # name = ' '.join(sys.argv[2:])
  51. # print(name)
  52. # # 打印机名称中有可能有空格
  53. # print(pdfprint(sys.argv[1], name))

  

  

3:打印完成后即可删除文件 pdfdelete.py

  1. # -*- coding: utf-8 -*-
  2.  
  3. # 声明字符编码
  4. # coding:utf-8
  5. import os, sys
  6. def pdfdelete(full_path):
  7. '''
  8. 根据文件全路径地址删除
  9. :param full_path:文件路径
  10. :return:True或False
  11. '''
  12. try:
  13. if (os.path.exists(full_path)):
  14. os.remove(full_path)
  15. print(full_path + '---删除成功')
  16. return True
  17. else:
  18. print(full_path + '---删除文件不存在')
  19. return False
  20. except Exception as e:
  21. print(str(e))
  22. return False
  23.  
  24. if __name__ == "__main__":
  25. pdfdelete(sys.argv[1])

  

补充:获取打印机状态

  1. # -*- coding: utf-8 -*-
  2.  
  3. # 声明字符编码
  4. # coding:utf-8
  5. import os, sys
  6. import win32api
  7. import win32print
  8. import json
  9. from handlingresult import handlingresult
  10.  
  11. GHOSTSCRIPT_PATH = "C:\\Program Files\\gs\\gs9.27\\bin\\gswin64.exe"
  12. GSPRINT_PATH = "C:\\Program Files\\GSPRINT\\gsprint.exe"
  13.  
  14. # 详细参考:https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rprn/1625e9d9-29e4-48f4-b83d-3bd0fdaea787
  15. # 对应:win32api 最上面有
  16. PRINTER_STATUE_STR = {
  17. "2": "打印机处于错误状态",
  18. "4096": "打印机无法打印",
  19. "262144": "打印机没有碳粉",
  20. "128": "打印机处于脱机状态",
  21. "2097152": "打印机内存不足",
  22. "524288": "打印机无法打印当前页面",
  23. "8": "纸张卡在打印机中",
  24. "16": "打印机缺纸",
  25. "64": "打印机有一个未指定的纸张问题",
  26. "1": "打印机暂停",
  27. "131072": "打印机墨粉不足",
  28. "1048576": "打印机出现错误"
  29. }
  30.  
  31. def printer_status_code(printer_name):
  32. '''
  33. 根据打印机名称获取状态
  34. :param printer_name:
  35. :return:
  36. '''
  37. result = handlingresult()
  38. try:
  39. hPrinter = win32print.OpenPrinter(printer_name)
  40. dic = win32print.GetPrinter(hPrinter, 2)
  41. stuta_int = dic.get('Status', 0)# 获取状态值
  42. result.Result = stuta_int
  43. stuta = PRINTER_STATUE_STR.get(str(stuta_int), None)
  44. if stuta == None:
  45. result.Message = '打印机状态:%s:\n %s' % (printer_name, result.Result)
  46. result.Successed = True
  47. else:
  48. result.Message = '打印机状态:%s:\n %s' % (printer_name, stuta)
  49. result.Successed = False
  50.  
  51. except Exception as e:
  52. result.Message = '打印机获取状态异常:%s:\n %s' % (printer_name, str(e))
  53. result.Result = None
  54. result.Successed = False
  55. js = json.dumps(result, default=lambda obj: obj.__dict__, sort_keys=True, indent=4)
  56. return js
  57.  
  58. if __name__ == "__main__":
  59. name = ' '.join(sys.argv[1:])
  60. print(printer_status_code(printer_name=name))
  61. # code = printer_status_code(
  62. # "Brother Color Leg Type1 Class Driver") # Brother Color Leg Type1 Class Driver HP LaserJet MFP M436 PCL-6 NPI84FFAF (HP LaserJet MFP M436)
  63. # print(code)

  

注:上面python调用打印机进行打印的份数这些设置后续有待完善。(打印份数可以循环调用打印即可)

C#调用Python脚本打印pdf文件的更多相关文章

  1. linux+php+apache web调用python脚本权限问题解决方案

    lamp : linux + apache + mysql + php 在上篇随笔中linux+php+apache调用python脚本时出现的问题的根本原因是:apache运行时使用的apache用 ...

  2. PHP 调用Python脚本

    上次做用户反馈自动翻译,写了个python脚本,将日文的用户反馈翻译成中文,效果虽然可以,但其它不懂python的童鞋就没法使用了,所以搭了个web服务,让其他人可以通过网页访问查询.使用的是apac ...

  3. Java调用Python脚本并获取返回值

    在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError.在 ...

  4. linux+php+apache web调用python脚本权限问题

    lamp : linux + apache + mysql + php 在近期项目中使用 linux + apache + php调用python脚本是出现以下权限问题: build/bdist.li ...

  5. C#调用Python 脚本语言

    1. 安装IronPython http://pan.baidu.com/s/1qW4jNJ2  下载IronPython 2.7 安装下载下来的安装包 2. 创建项目 创建一个C#的Windows窗 ...

  6. java调用python脚本并向python脚本传递参数

    1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...

  7. (转)java调用python脚本

    这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用 ...

  8. python脚本解析json文件

    python脚本解析json文件 没写完.但是有效果.初次尝试,写的比较不简洁... 比较烦的地方在于: 1,中文编码: pSpecs.decode('raw_unicode_escape') 2,花 ...

  9. C#调用Python脚本的简单示例

    C#调用Python脚本的简单示例 分类:Python (2311)  (0)  举报  收藏 IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Huguni ...

随机推荐

  1. HTML编码和CSS编码会遇到的问

    http://codeguide.bootcss.com/#html-syntax  参考链接 属性顺序 HTML 属性应当按照以下给出的顺序依次排列,确保代码的易读性. class id, name ...

  2. redis安装、使用

    官网:http://redis.io/ github地址:https://github.com/antirez/redis 简介:         redis是一个key-value存储系统.和Mem ...

  3. JS前端调用后台方法

    //JS前端代码function Exportqmdltb() { var areavalue= GetQmdltmValue(); $.ajax({ type: "post", ...

  4. Socket 异步通信

    最近在写数据通信的时候用到的东西!希望对大家有帮助 /// <summary> /// 获取或设置服务器IP地址 /// </summary> public string se ...

  5. What is RandomCharacter.getRandomLowerCaseLetter() ?????

    今天在看书顺便打打书上的代码时,看到这么一个方法的调用RandomCharacter.getRandomLowerCaseLetter()! 年轻的我看到这一大串单词时还以为是JDK自带类里面方法Or ...

  6. 运算符优先级--C

    优先口决 括号成员第一; //括号运算符[]() 成员运算符. -> 全体单目第二; //所有的单目运算符比如++ -- +(正) -(负) 指针运算*& 乘除余三,加减四; //这个& ...

  7. 洛谷 P1129 解题报告

    P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...

  8. 创建第一个core项目(netCore学习笔记1)

    1.安装 core和netFramework其实是相对独立的,但是core的IDE是在vs2017才开始支持,而vs2017的安装环境必须搭配.net4.6,所以: Step1:安装.net4.6 S ...

  9. MongoDb进阶实践之七 MongoDB的索引入门

    一.引言     好久没有写东西了,MongoDB系列的文章也丢下好长时间了.今天终于有时间了,就写了一篇有关索引的文章.一说到"索引",用过关系型数据库的人都应该知道它是一个什么 ...

  10. java thread yield 的设计目的是什么?

    如题,java thread yield 的设计目的是什么?有什么实际应用场景吗? Ps:它的作用是理解的,和 join 等的区别也理解.就是个人感觉这个设计有点鸡肋(可能是个人读书太少...) It ...