java主线程结束和子线程结束之间的关系

你应该换成main函数运行,abcd就一定会打印出来了问题并不是出在主线程和子线程身上,事实上Java似乎也没有严格主线程和子线程的概念,取而代之的是普通线程和后台线程但是这里你采用@Test来运行代码,而@Test是JUnit测试框架使用的注解,JUnit在进行单元测试的时候,如果被@Test注释的方法执行完成,那么内部开启的线程也会被强制退出,退出是测试框架进行的操作这和Java承诺的普通线程不退出程序就不结束是不相符的,如果书上告诉你会输出两个但是你执行了只输出了一个那么很可能就是这里出了问题而通过main函数则没有框架干预,根据Java的规则只要有普通线程没有退出,程序就不会完全退出(System.exit强制自杀除外),那么除非创建的线程被设置成了后台线程(或者叫守护线程,daemon),那么才会在主线程退出时自动关闭这些后台线程,就是你遇到的偶尔可以输出abcd偶尔不行的效果,否则一定会abcd和efgh两个都输出,只不过输出顺序可能不一致

学新通

java里面在主线程产生多个子线程,怎么让这些子线程同时运行,运行完以后再继续执行主线程??

//采用线程中的jion()方法合并线程详细案列详见下面的代码

publicclassMyJionThreadDemo{

publicstaticvoidmain(String[]args){

JionDemo[]arr=newJionDemo[100];

for(inti=0;i

arr[i]=newJionDemo();

for(inti=0;i

arr[i].join();

}catch(InterruptedExceptione){

e.printStackTrace();

arr[i].start();

for(inti=0;i<100;i ){//主线程最后运行

System.out.println("线程:" Thread.currentThread().getName() "正在运行");

classJionDemoextendsThread{

@Override

publicvoidrun(){

for(inti=0;i<5;i ){

System.out.println("线程:" currentThread().getName() "正在运行");

System.out.println("线程:" currentThread().getName() "运行结束");

Java中的线程组有什么特点?

在创建之初,线程被限制到一个组里,而且不能改变到一个不同的组

学新通

Java线程知识有哪些?

  线程也是Java中的相当重要的组成部分之一。

甚至最简单的Applet也是由多个线程来完成的。在Java中, 任何一个Applet的paint()和update()方法都是由AWT(Abstract Window Toolkit)绘图与事件处理线程调用的,而Applet 主要的里程碑方法——init(),start(),stop()和destory() ——是由执行该Applet的应用调用的。

Java 实现子线程返回值的几种方法

(1)继承Thread类,重写run函数

class xx extends Thread{

public void run(){

Thread.sleep(1000) //线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源

开启线程:

对象.start() //启动线程,run函数运行

(2)实现Runnable接口,重写run函数

开启线程:

Thread t = new Thread(对象) //创建线程对象

t.start()

(3)实现Callable接口,重写call函数

Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

Callable和Runnable有几点不同:

①Callable规定的方法是call(),而Runnable规定的方法是run().

②Callable的任务执行后可返回值,而Runnable的任务是不能返回值的

③call()方法可抛出异常,而run()方法是不能抛出异常的。

④运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等

待计算的完成,并检索计算的结果.通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果有多种实现方式,下面列出两种。

第一种:实现callable类,使用有返回值的线程,只有线程执行完成后才会返回结果。

import java.util.arraylist;

import java.util.list;

import java.util.random;

import java.util.concurrent.*;

public class main {

// 初始化一个容量为10的线程池

static final executorservice pool = executors.newfixedthreadpool(10);

public static void main(string[] args) throws executionexception, interruptedexception {

list> futures = new arraylist<>();

for (int i = 0; i  future : futures) {

string name = future.get();

system.out.println(name   "执行完成...");

}

system.out.println("所有线程执行完成!");

}

class mythread implements callable {

private string name;

public mythread(string name) {

this.name = name;

}

@override

public string call() throws exception {

// todo 执行业务

// 随机延迟,模拟线程耗时

thread.sleep(1000   new random().nextint(2000));

return name;

}

}第二种:使用countdownlatch实现线程计数,代码如下:

import java.util.random;

import java.util.concurrent.countdownlatch;

import java.util.concurrent.executionexception;

import java.util.concurrent.executorservice;

import java.util.concurrent.executors;

public class main2 {

// 初始化一个容量为10的线程池

static final executorservice pool = executors.newfixedthreadpool(10);

public static void main(string[] args) throws interruptedexception {

int threadcount = 3;

// 初始化countdownlatch,用于线程计数

countdownlatch latch = new countdownlatch(threadcount);

for (int i = 0; i 

2018-05-27

0

学新通

java实现多线程的两种方法

Thread t1=new Thread(){

public void run(){

System.out.println("第一种方法");

t1.start();

Thread t2=new Thread(new Runnable() {

public void run() {

System.out.println("第二种方法,可实现同类下各线程数据共享");

});

t2.start();实现Runnable接口,或者继承Thread类。

然后重写run()方法。很简单啊 两种方式:

1:继承thread

2:实现runable接口

考虑到java的单继承多实现,所以建议采用第二种。你好,java实现多线程的两种方法是

1、继承Thread

2、实现Runnable