我们继续上一次的内容

java 等所有线程执行完执行主线程 java线程执行过程_java 等所有线程执行完执行主线程

  一:线程的状态图:


java 等所有线程执行完执行主线程 java线程执行过程_System_02


   线程是具有生命周期的,线程的“一生”如下:

   ◆线程从new开始,进入到创建状态

就绪状态,但这是并一定马上执行,这时要看系统的资源分配情况

运行。进行到这里就有很多种情况发生:

   (1)如果时间片用完或者yield一下,则又进入到了就绪状态;

   (2)正常情况下,线程的运行体结束,即线程的run方法结束后,线程结束

(3)运行的时候,其他的线程可以join进来,你自己也可以sleep一会,或者你需要等待输入数据,这三种情况会使进程进入到阻塞状态;        ◆如果进程由于图中的三种原因而进入到了阻塞状态后,则又可以因为“睡醒了”,输入结束了,join进来的线程执行结束了等多种原因进入到就绪状态。注意:阻塞之后不能直接进入到运行状态,而是就绪状态。打个比方:你在火车站排队买票,你已经进入到运行(买票)状态,中途你睡着了(阻塞了),一个小时后,你睡醒了,这时你只能让队伍的后面继续排队,等待买票,而不是醒了直接去买票。(很可能挨揍哦)

   二:线程相关的常用类

   ◆TimerTask:定时器任务。他实现了Runnable接口,因此继承自它的类应重写run方法表示计时任务。

   ◆Timer:定时器、调度器、计时器。可以用schedule(任务对象,暂停的秒数,任务执行的频率);方法来安排任务的执行。

   三:具体应用:动态欢迎界面的制作,就可以运用线程以及线程常用类的知识。

TimerTask计时任务去做,每隔一段时间(任务的执行频率),让显示图片的Lable空间一个一个的显示图片,最后关闭定时器,关闭欢迎窗口,进入到主界面(程序中的主界面为控制台)。

   ●步骤:

   1:创建Logo类,继承JFrame,添加构造方法,添加main方法,在main方法中创建Logo对象,以实现程序一运行就出现窗体

   2:添加基本的信息(一般放在构造方法的最后面)

setContentPane(pnBasic);
        setTitle("欢迎光临");//设置窗体标题
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体默认的退出方式
        setBounds(200, 200, 400, 300);//设置窗体的大小
        setVisible(true);//是窗体可见

   3:添加基础面板,设置基础面板的布局,定义展示照片的Lable标签控件

JPanel pnBasic = new JPanel();//基础面板
pnBasic.setLayout(new BorderLayout());//BorderLayout布局
lb = new JLabel();//展示图片的标签控件
lb.setIcon(new ImageIcon(TestLogo.class.getResource("../assets/logo/1.png")));//为控件添加第一张展示图片,这里运用到了反射的概念,在工程下面查找资源文件

   4:添加控件到基础面板上,添加基础面板到窗体上


pnBasic.add(lb);setContentPane(pnBasic);

   5:编写计时任务(内部类的形式)extends Timertask,这里的计时任务是指图片一个接一个的展示。


private class MyLogo extends TimerTask{
    //编写计时任务,继承自TimerTask
        @Override
        public void run() {//重写run方法
            if(niIndex<7){//判断图片下标小于7(资源中的7张图片)吗
                niIndex++;//如果小于,下标加加,指到下一张图片
                lb.setIcon(new ImageIcon(TestLogo.class.getResource("../assets/logo/"+niIndex+".png")));//字符串拼接,让Lable展示下一张图片
            }else {//小标>=7时
                time.cancel();//计时任务结束
                dispose();//窗体退出
                System.out.println("进入主界面");//进入到主界面
            }
        }
                                                                                                                    
    }

6:添加线程,完成功能


time = new Timer();//提取成全局变量
time.schedule(new MyLogo(),1000,500);//安排任务

   至此,欢迎界面做好了,运行的资源文件及源码,感兴趣的话可以试一试。运行起来不是很美观,蓝蓝 的窗体很难看,这时我们在第3步与第4步之间添加让窗口透明化的两条语句,是界面看起来更美观


//设置窗体为透明的
        setUndecorated(true);
        //这条语句在使用时,要在工程下面导入包:
        //工程--属性--builder path --remove 掉原来的JRE System library --add Library--选择JRE System library--OK
        AWTUtilities.setWindowOpaque(this, false);

这一次看起来美观了不少吧。。。


   线程的基础知识在这里差不多都有介绍,可能具体的应用还得我们自己去实践,才会有更深的领悟。(啊,多么痛的领悟。)


转载于:https://blog.51cto.com/cinderella7/1266798