java中线程的小细节

什么是java中的主线程?

java执行入口—main方法时,就启动了一个线程,该线程即java中的主线程。那么在main再创建了线程,则 为程序的其他线程了。

一个可执行的java程序最少有几个线程?

两个。一个是main线程,一个垃圾收集线程。

线程有几个状态

创建、运行、中断、死亡

线程中断有几种原因?

①JVM将CPU资源从当前线程切换给了其他线程

②线程中执行了Thread的一个类方法:sleep,立刻让出cpu使用权(过了sleep指定的时间,继续排队)

③线程中执行了wait方法,进入等待状态(需要其他线程调用notify或notifyAll方法来唤醒,继续排队)

④线程中执行某个操作进入了阻塞状态,例如进行了I/O操作(不直接排队,当阻塞原因消除时,才继续排队)

线程的isAlive()方法是描述的线程哪一个状态呢?

线程在调用start()方法后到run()方法结束运行之前,isAlive()方法都会返回true

GUI编程中声明了一个线程,可以多次触发器创建实体吗?

声明的同一个线程,不能被重复的分配实体(即在死亡之前,只能被创建一次),如果被再次创建,则先前实体则会成为垃圾,并且这个垃圾不会被垃圾收集机释放,则造成了内存泄漏与程序运行bug

import java.text.SimpleDateFormat;
import java.util.Date;

public class WrongThread implements Runnable {
    Date date;
    SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
    int time = 0;
    @Override
    public void run() {
        while (true) {
            date = new Date();
            System.out.println(sdf.format(date));
            time++;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (time == 3) {
                Thread thread = Thread.currentThread();//获取当前线程
                thread = new Thread(this);//再次分配实体
                thread.start();
            }
        }
    }
}
//java入口
public class Main {
public static void main(String[]args){
    WrongThread wrongThread=new WrongThread();
    Thread thread=new Thread(wrongThread);
    thread.start();
}
}

运行结果显示:当前线程被分配新的实体后,先前的实体被没有被释放,时间被打印了两次。


java中线程的小细节_第1张图片
程序执行结果
GUI编程中,线程能被多次调用start()方法吗?

在线程死亡之前,不能再次调用start()方法,会产生ILLegalThreadStateException异常

多个线程操作同一个目标对象的实现(女朋友花钱问题)

比如:你在不断的挣钱,女朋友在不断的花钱,看是你挣得快,还是女朋友花的快?

import java.util.Random;
/*
 * 男挣到100就赢了,女花完就赢了
 */
public class Money implements Runnable {
    private int money;

    Money(int money) {
        this.money = money;
    }

    @Override
    public void run() {
        // costMoney();
        while (true) {
            String name = Thread.currentThread().getName();
            if (name.equals("boy")) {
                if (money >= 100) {
                    System.out.println("---------男朋友:达到了100了,我赢了-------------------");
                    return; // 男朋友挣到100的线程进入死亡状态
                }
                Random random = new Random();
int addMoney=random.nextInt(100);
                money = money + addMoney;
                System.out.println("男朋友:挣了"+addMiney"元,现在为" + money + "元");
            }
            if (name.equals("girl")) {
                if (money <= 0) {
                    System.out.println("----------女朋友:花完了,我赢了------------");
                    return;// 女朋友花钱的线程进入死亡状态
                }
                Random random = new Random();
int removeMoney=random.nextInt(100);
                money = money -removeMoney;
                System.out.println("女朋友:花了"+addMiney"元,现在为" + money + "元");
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
//java入口
public class Main {
public static void main(String[]args){
    Money money=new Money(50);
    Thread boy=new Thread(money);
    Thread girl=new Thread(money);
    boy.setName("boy");
    girl.setName("girl");
    boy.start();
    girl.start();
}
}

你可能感兴趣的:(java中线程的小细节)