美文网首页
java中线程的小细节

java中线程的小细节

作者: 文艺复兴小青年 | 来源:发表于2017-11-15 18:42 被阅读0次
    什么是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();
    }
    }
    
    

    相关文章

      网友评论

          本文标题:java中线程的小细节

          本文链接:https://www.haomeiwen.com/subject/geuhvxtx.html