什么是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();
}
}
运行结果显示:当前线程被分配新的实体后,先前的实体被没有被释放,时间被打印了两次。
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();
}
}