JAVA之多线程(二)

来源:互联网 发布:mac电脑开不了机 编辑:程序博客网 时间:2024/06/05 16:06
人有生老病死,一个周期,线程也不例外,它包括有七种状态:

出生状态,就绪状态,运行状态,等待状态,休眠状态阻塞状态,死亡状态。
很多人都认为多线程是同时执行,其实不然,在同一个时间点只有一个线程被执行,因为线程的切换速度太快,所以让人误以为是同时进行。


    下面举个老栗子:

这里写图片描述
代码如下:

package com.xiancheng2.org;import java.awt.Color;import java.awt.Graphics;import java.util.Random;import javax.swing.JFrame;public class SleepWayTest extends JFrame{        private Thread t;        //定义颜色数组        private static Color[] color = {            Color.BLACK,Color.BLUE,Color.CYAN,Color.GREEN,Color.ORANGE        };        private final static Random rand = new Random();        private static Color getC(){            return color[rand.nextInt(color.length)];        }        public SleepWayTest(){            t = new Thread(new Runnable() {                int x = 30;                int y = 50;                @Override                public void run() {                    // TODO Auto-generated method stub                    while(true){                        try {                        //线程休眠0.1秒                            Thread.sleep(100);                        } catch (InterruptedException e) {                            // TODO: handle exception                            e.printStackTrace();                        }                        //获取组件绘图上下文对象                        Graphics graphics = getGraphics();                        //设置绘图颜色                        graphics.setColor(getC());                        //绘制直线并递增垂直坐标                        graphics.drawLine(x, y, 100, y++);                        if(y >= 80){                            y = 50;                        }                    }                }            });            t.start();        }        public static void main(String[] args){            init(new SleepWayTest(),100,100);        }        //初始化程序界面        public static void init(JFrame frame,int width,int height){            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            frame.setSize(width, height);            frame.setVisible(true);        }}

getC()方法:用于随机产生Color类型的对象
getGraphics():顾名思义获取Graphics对象
setColor():为图形设置颜色。


    下面说下关于线程的加入问题,其实很简单,打个比方小狼在家打LOL,这时有警察来调查案子,小狼就不得不放下LOL,去开门配合调查,调查完才能继续打撸。线程就是这样,当某个线程使用join()方法加入到另外一个线程,那个被加入的线程就要等待该线程执行完毕后再继续执行。    上个栗子:
package com.xiancheng2.org;import java.awt.BorderLayout;import javax.swing.JFrame;import javax.swing.JProgressBar;public class JoinExample extends JFrame {        private Thread threadA;        private Thread threadB;        private JProgressBar progressBar1 = new JProgressBar();        private JProgressBar progressBar2 = new JProgressBar();        int count = 0;        public static void main(String[] args){            init(new JoinExample(),100,100);        }        public JoinExample(){            super();            getContentPane().add(progressBar1, BorderLayout.NORTH);            getContentPane().add(progressBar2, BorderLayout.SOUTH);            progressBar1.setStringPainted(true);            progressBar2.setStringPainted(true);            threadA = new Thread(new Runnable(){                int count = 0;                public void run(){                    while(true){                        progressBar1.setValue(++count);                        try {                            threadA.sleep(100);                            threadB.join();                        } catch (Exception e) {                            // TODO: handle exception                            e.printStackTrace();                        }                    }                }            });            threadA.start();            threadB = new Thread(new Runnable(){                int count = 0;                public void run(){                    while(true){                        progressBar2.setValue(++count);                        try {                            Thread.sleep(100);                        } catch (Exception e) {                            // TODO: handle exception                            e.printStackTrace();                        }                        if(count == 100)                            break;                    }                }            });            threadB.start();        }        public static void init(JFrame frame,int width,int height){            frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);            frame.setSize(width, height);            frame.setVisible(true);        }}

当加入的线程结束,另一个线程才能运行。


下面来说下如何中断线程,可能首先回想到使用stop()方法,但现在提倡使用在RUN()方法中使用无限循环形式,然后使用一个布尔型标记控制循环的停止。
上栗子:

package com.xiancheng2.org;import java.awt.BorderLayout;import javax.swing.JFrame;import javax.swing.JProgressBar;public class InterruptedThread extends JFrame{        Thread thread;        public static void main(String[] args){            init(new InterruptedThread(),100,100);        }        public InterruptedThread(){            super();            final JProgressBar progressBar = new JProgressBar();            getContentPane().add(progressBar, BorderLayout.NORTH);            progressBar.setStringPainted(true);            thread = new Thread(new Runnable() {                int count = 0;                @Override                public void run() {                    // TODO Auto-generated method stub                    while(true){                        progressBar.setValue(++count);                        try {                            Thread.sleep(100000);                        } catch (InterruptedException e) {                            // TODO: handle exception                            System.out.println("线程中断");                            break;                        }                    }                }            }) ;            thread.start();            thread.interrupt();        }        public static void init(JFrame frame,int width,int height){            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            frame.setSize(width, height);            frame.setVisible(true);        }}

interrupt()方法使线程离开run()方法


See U~~

原创粉丝点击