main-java 子线程结束结束 内部子线程也结束 具体看代码注释

问题描述

java 子线程结束结束 内部子线程也结束 具体看代码注释

import java.util.ArrayList;

import org.junit.Test;

/**

  • 代码很简单的 就是起了一个线程 然后在一个list里面放了1000个数字 然后打印以下
  • 但是test方法 用junit起的 不能完全打印 而main可以
  • 最终是想要使得这个test方法能和main的效果一样
    *
    */
    public class TestSub {

    @Test
    public void test() {
    /**
    * 此处是在junit测试下面执行的线程 但是list里面的值不能被完全打印出来
    * 我猜想这个方法是在一个子进程里面进行的 而里面又有一个子线程 但是最外层的子线程(test方法)一结束 里面的子线程也全部结束
    */
    new Thread(new Runnable() {

        @Override
        public void run() {
            long start = System.currentTimeMillis();
            ArrayList<Integer> list = new ArrayList<Integer>();
    
            for (int i = 0; i < 1000; i++) {
                list.add(i);
            }
            for (Integer value : list) {
                System.out.println("list size : " + list.size() + " current value : " + value);
            }
            long end = System.currentTimeMillis();
            System.out.println("takes time :" + (end - start));
        }
    }).start();
    System.out.println("线程执行结束 test方法执行完毕");
    

    }

    /**

    • main函数的线程 与 上面测试方法的子线程不同 它执行完方法后 里面的子线程仍旧会执行完毕
    • 如何让上面的test方法与main函数执行的结果一样
    • @param args
      */
      public static void main(String[] args) {

      new Thread(new Runnable() {

      @Override
      public void run() {
          long start = System.currentTimeMillis();
          ArrayList<Integer> list = new ArrayList<Integer>();
      
          for (int i = 0; i < 1000; i++) {
              list.add(i);
          }
          for (Integer value : list) {
              System.out.println("list size : " + list.size() + " current value : " + value);
          }
          long end = System.currentTimeMillis();
          System.out.println("takes time :" + (end - start));
      }
      

      }).start();
      System.out.println("主线程执行结束 main方法执行完毕");

    }
    }

解决方案

去看下thread相关的文档

解决方案二:

我猜想这个方法是在一个子进程里面进行的 而里面又有一个子线程 但是最外层的子线程(test方法)一结束 里面的子线程也全部结束

你分析的应该很有道理,我觉得应该是java的垃圾回收机制引起的,当test执行完成后java会进行自动的垃圾回收,把里面的子线程给结束了

你可以在子线程里

System.out.println("线程执行结束 test方法执行完毕");

前先执行线程同步,保证线程执行完成再向后执行最后的语句

解决方案三:

ok,我给你答案但是不给出原因,你自己去找答案

Thread t = new Thread(new Runnable() {
@Override
public void run() {
long start = System.currentTimeMillis();
ArrayList list = new ArrayList();

    for (int i = 0; i < 1000; i++) {
        list.add(i);
    }
    for (Integer value : list) {
        System.out.println("list size : " + list.size() + " current value : " + value);
    }
    long end = System.currentTimeMillis();
    System.out.println("takes time :" + (end - start));
}

});
t.start();
t.join();

System.out.println("主线程执行结束 main方法执行完毕");

解决方案四:

你加上一个状态字段来控制线程是否运行结束,然后在进程中进行判断,如果线程结束,手工控制进行结束;如果线程为运行结束,在进程中等待;
在进程中定义flag为false,传递给线程,线程结束,置为true,在进程中循环判断flag为true,退出进程。

解决方案五:

找到原因了 这是junit本身测试多线程的不足

时间: 2024-10-09 18:37:18

main-java 子线程结束结束 内部子线程也结束 具体看代码注释的相关文章

java查找字符串中的包含子字符串的个数实现代码_java

1. 用indexof的方法: public class Test11 { private static int counter = 0; /** * @param args */ public static void main(String[] args) { String str ="sdSS**&HGJhadHCASch& ^^"; int i = stringNumbers(str); System.out.println(i); } public static

c++中如何将子线程的参数传回主线程

问题描述 c++中如何将子线程的参数传回主线程 1C DWORD WINAPI threadFunction(LPVOID pArg) //返回值进程id(dword类型) 参数类型 LPVOID{ tNum myNum = *((tNum *)pArg); //将参数转化成int型 EnterCriticalSection(&gCS); // 进入临界区 myNum.string_back = FuzzyHash(myNum.string_in); LeaveCriticalSection(&a

java子菜单消失-java中窗体设计的JMenuBar子菜单的问题

问题描述 java中窗体设计的JMenuBar子菜单的问题 JMenu baseDate=new JMenu("基础数据维护"); //menuBar.add(baseDate); //toolBar.add(menuBar); //baseDate.setHideActionText(false); JMenuItem readMana=new JMenuItem("读者信息管理"); JMenuItem bookMana=new JMenuItem("

java多行输入问题-求助:关于多行输入:输入多行后结束(不用自己定义的结束条件,如下描述)

问题描述 求助:关于多行输入:输入多行后结束(不用自己定义的结束条件,如下描述) 看起来很简单,可是实际去做没找到具体的方法,网上查了很多,不是我想要的,求大神指定一下: 一次从键盘输入多行后结束 如 12 12 12 321 2131 321 123 然后输入结束,不加结束控制字符,如输入一行为end然后结束等,也不用最后一样输入后输入一个空行作为结束标志, 如 123 12321 结束. 另外问一句,当我们按enter键,java读入的是n,还是r,还是rn,我做了一下实验(读入,然后用eq

相对位置不改变-android如何实现容器等比例放大,内部子控件也等比例放大,而且相对位置不发生改变

问题描述 android如何实现容器等比例放大,内部子控件也等比例放大,而且相对位置不发生改变 android如何实现容器等比例放大,内部子控件也等比例放大,而且相对位置不发生改变,求大神解答 解决方案 动态设置容器和自控件的LayoutParams,抽取基数,抽取倍数就可以了,根据基数乘以倍数就是最后的大小

ios-怎么在一个线程结束后回到主线程?

问题描述 怎么在一个线程结束后回到主线程? 我用一个for循环上传三张照片(用的是afnetworking框架). 上传它就开了一个线程,上传成功后后台返回一个filename,把filename放进一个数组 我想等三张照片全都上传结束后,对获取到的三个filename进行操作 要怎么做? NSMutableArray *fileNameArr = [[NSMutableArray alloc]init]; for (int i= 0; i<[self.imgArr count]; i++) {

Java多线程:“基础篇”10之线程优先级和守护线程

1. 线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5."高优先级线程"会优先于 "低优先级线程"执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon()方法来区别它们:如果返回false, 则说明该线程是"用户线程":否则就是"守护线程". 用户线程一般用户执 行用户级任务,而守护线程也就是"后台线程",一般用来执行后台任务.需要注意的是: Java虚拟

JVM 内部运行线程介绍

感谢同事[觉梦]投递此稿. hi,all 最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据.  前段时间因为系统代码问题,造成性能瓶颈,于是就dump了一份stack出来进行分析.  stack 里面线程非常多,排查起来需要一定的经验,所以,对它们有一定了解,可以提高排查问题的效率.  现在网上资料也不是特别全,所以,导致很多新人在拿到一个stack文件之后,也不知知道从何看起. 下面我把这次整理的一些个人认为比较常见的线程列出来. 线程

java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]

线程通信,线程之间的消息传递: 多个线程在操作同一个资源,但对共享资源的操作动作不同:它们共享同一个资源,互为条件,相互依赖,相互通信让任务向前推进. 线程的同步,可以解决并发更新同一个资源,实现线程同步;但不能用来实现线程间的消息传递. 线程通信生产者和消费者和仓库是个典型模型: 生产者:没有生产之前通知消费者等待,生产产品结束之后,马上通知消费者消费 消费者:没有消费之前通知生产者等待,消费产品结束之后,通知生产者继续生产产品以供消费 线程通信:使用java中Object中提供的: publ