【问题标题】:How args.length is getting used to set the max time limit Java concurrency programargs.length 如何用于设置 Java 并发程序的最大时间限制
【发布时间】:2015-11-19 22:46:44
【问题描述】:

我在 Oracle 官方教程页面中学习了并发性,我查看了一个代码示例,其中有一个线程等待 4 秒从字符串数组中打印一个元素,但同时设置了一个“耐心”变量(一个小时)在进程需要一个多小时的情况下中断线程(尽管这永远不会发生,因为字符串数组中只有 4 个元素间隔 4 秒)我怀疑是在声明和验证耐心时间,这是唯一给我带来麻烦的部分。这是代码`

  long patience= 1000 * 60 * 60;

   if (args.length > 0)
   {
       try{
           patience= Long.parseLong(args[0]);
       }

    catch(NumberFormatException e)
            {
              threadMessage("Argument must be an integer");
            }
   }`

【问题讨论】:

  • 您的“怀疑在于声明和验证......”。你在怀疑什么?你有什么问题
  • “如何使用 args.length 来设置最大时间限制”:不是。你的问题没有意义。

标签: java multithreading concurrency


【解决方案1】:

耐心宣言:-

long patience= 1000 * 60 * 60;

上面一行声明了耐心的默认值,即 1 小时。
仅当命令行参数不存在时才使用以上的耐心值。

if (args.length > 0)
   {
       try{
           patience= Long.parseLong(args[0]);
       }

在上面的代码中,如果存在命令行参数,则将其分配给耐心。

a) 命令行参数作为字符串数组(即 args)传递,因此您正在检查数组的长度,如果它的长度大于 1,则表示传递了一些参数。
b) 由于命令行参数是一个字符串值,因此您正在使用 parseLong(args[0]) 将其转换为 long,您正在解析数组 args 的第一个元素。
c) 如果传递的参数无法解析为长值,则抛出 NumberFormatException 例如如果传递 abc,则无法解析为 long 值。

Tutorial for passing command line argument to java program

记住 Thread 类 sleep 和 join 方法需要毫秒作为参数,所以你作为命令行参数提供的值需要以毫秒为单位。 所以最好使用下面的代码:-

 patience = Long.parseLong(args[0]) * 1000; //convert seconds to milliseconds

验证:-

验证耐心的两种方法
1)首先传递一个小于4秒的耐心值,比如说2秒。大约 2 秒后,您可以立即看到主线程的中断。通过这种方法收到以下输出:

Output:-

    main: Starting MessageLoop thread
    main: Waiting for MessageLoop thread to finish
    main: Still waiting...
    main: Still waiting...
    main: Tired of waiting!
    Thread-0: I wasn't done!
    main: Finally!

2) 您可以让 MessageLoop 线程休眠 1 小时以上,以防您使用默认值耐心。请看下面的代码:-

Thread t = new Thread(new MessageLoop());
            Thread.sleep(patience+10000l);
            t.start();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-21
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多