操作线程的方法

来源:互联网 发布:乐视软件商城 编辑:程序博客网 时间:2024/06/18 11:05

操作线程有很多方法,这些方法可以使线程从某一种状态过渡到另一种状态。


线程的休眠

一 种 能 控 制 线 程 行 为 的 方 法 是 调 用 Sleep() 方 法 。Sleep()方 法 需 要 一 个 参 数 用 于 指 定 该 线 程 休 眠 的 时 间 , 该 时 间 使 用 毫 秒 为 单 位 。它通常在run()方法中被使用。

Sleep() 方 法 的 语 法 格 式 如 下 :

try{    Thread.sleep(2000); }catch(InterruptedException){    e.printStackTrace(); }

上 述 代 码 不 会 使 线 程 在 2 秒 之 内 进 入 就 绪 状 态 。 由 于 sleep() 方 法 的 执 行 有 可 能 抛 出 Interrupted Exception 异 常 , 所 以 将 Sleep()方 法 的 调 用 放 在 try•••catch 块 中 。 虽 然 使 用 了 Sleep() 方 法 的 线 程 在 一 段 时 间 内 会 醒 来 , 但 是 并 不 能 保 证 它 醒 来 后 进 入 运 行 状 态 , 只 能 保 证 它 进 入 就 绪 状 态 。
为。
〖 例 〗 在 项 目 中 创 建 SleepMethodTest 类 , 该 类 继 承 了 JFrame 类 , 实 现 在 窗 体 中 自 动 画 线
段 的 功 能 , 并 且 为 线 段 设 置 颜 色 , 颜 色 是 随 机 产 生 的 。

import java.awt.Color;import java.awt.Graphics;import java.util.Random;import javax.swing.JFrame;public class SleepMethodTest extends JFrame{    private Thread t;    //定义颜色数组    private static Color[] color={Color.BLACK,Color.BLUE,Color.CYAN,Color.GREEN,Color.ORANGE,Color.YELLOW,Color.RED,Color.PINK,Color.LIGHT_GRAY};    private static final Random rand=new Random();  //创建随机对象    private static Color getC(){        return color[rand.nextInt(color.length)];//获取随机颜色值的方法    }    public SleepMethodTest(){        t=new Thread(new Runnable(){   //创建匿名线程对象            int x=30;  //定义初始坐标            int y=50;            public void run(){   //覆盖线程接口的方法                while(true){   //无限循环                    try {                        t.sleep(1000);  //线程休眠0.1秒                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        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 SleepMethodTest(),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);    }}

结果:

这里写图片描述

线程的加入

如 果 当 前 某 程 序 为 多 线 程 程 序 , 假 如 存 在 一 个 线 程 A , 现 在 需 要 插 入 线 程 B , 并 要 求 线 程 B 先 执 行 完 毕 , 然 后 再 继 续 执 行 线 程 A , 此 时 可 以 使 用 Thread 类 中 的 join() 方 法 来 完 成 。 这 就 好 比 此 时 我 们 正 在 看 电 视 , 却 突 然 有 人 上 门 收 水 费 , 我 们 必 须 付 完 水 费 后 才 能 继 续 看 电 视 。
当 某 个 线 程 使 用 join() 方 法 加 入 到 另 一 个 线 程 时 , 另 一 个 线 程 会 等 待 该 线 程 执 行 完 毕 再 继 续 执 行 。

〖 例 〗 在 项 目 中 创 建 JoinTest 类 , 该 类 继 承 了 JFrame 类 。 该 实 例 包 括 两 个 进 度 条 , 进 度 条
的 进 度 由 线 程 来 控 制 , 通 过 使 用 join() 方 法 使 上 面 的 进 度 条 必 须 等 待 下 面 的 进 度 条 完 成 后 才 可 以 继 续 。


线程的中断

在 以 往 时 候 会 使 用 stop() 方 法 停 止 线 程 , 但 当 前 版 本 的 JDK 早 己 废 除 了stop() 方 法 , 同 时 也 不 建 议 使 用 stop() 方 法 来 停 止 一 个 线 程 的 运 行 。 现 在 提 倡 在 run() 方 法 中 使 用 无 限 循 环 的 形 式 , 然 后 使 用 一 个 布 尔 型 标 记 控 制 循 环 的 停 止 。

〖 例 1 〗 在 项 目 中 创 建 InterruptedTest 类 , 该 类 继 承 了 Runnable 类 , 设 置 线 程 正 确 的 停 止 方 式 。

public class InterruptedTest implements Runnable{    private boolean isContinue=false;    //设置一个标记变量    @Override    public void run() {  //重写run方法        // TODO Auto-generated method stub        while(true){            if(isContinue){  //当isContinue变量为true时,停止线程                break;            }        }    }    public void setContinue(){        this.isContinue=true;   //定义isContinue变量为true的方法    }}

如 果 线 程 是 因 为 使 用 了 sleep() 或 wait() 方 法 进 入 了 就 绪 状 态 , 这 时 可 以 使 用 read 类 中 的Interrupt() 方 法 使 线 程 离 开 run() 方 法 , 同 时 结 束 线 程 , 但 程 序 会 抛 出 InterruptedException 异 常 。

〖 例 2 〗 在 项 目 中 创 建 InterruptedSwmg 类 , 该 类 继 承 了 Runnable 类 , 创 建 一 个 进 度 条 , 在 表 示 进 度 条 的 线 程 中 使 用 interrupted() 方 法 。

import java.awt.BorderLayout;import javax.swing.JFrame;import javax.swing.JProgressBar;public class InterruptedDemo extends JFrame{    Thread thread;    public static void main(String[] args) {        init(new InterruptedDemo(),100,100);    //调用方法    }    public InterruptedDemo(){        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(1000);   //使线程休眠1秒                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        System.out.println("当前线程被中断");                    }                }            }        });        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);    }}

结果:
这里写图片描述
线程被中断


线程的礼让

Thread 类 中 提 供 了 一 种 礼 让 方 法 , 使 用 yield() 方 法 表 示 , 它 只 是 给 当 前 正 处 于 运 行 状 态 下 的 线 程 一 个 提 醒 , 告 知 它 可 以 将 资 源 礼 让 给 其 他 线 程 , 但 这 仅 仅 是 一 种 暗 示 , 没 有 任 何 一 种 机 制 保 证 当 前 线 程 会 将 资 源 礼 让 。
yield() 方 法 使 具 有 同 样 优 先 级 的 线 程 有 进 入 可 执 行 状 态 的 机 会 , 当 当 前 线 程 放 弃 执 行 权 时 会 再 度 回 到 就 绪 状 态 。 对 于 支 持 多 任 务 的 操 作 系 统 来 说 , 不 需 要 调 用 yeild() 方 法 , 因 为 操 作 系 统 会 为 线 程 自 动 分 配 CPU 时 间 片 来 执 行 。


原创粉丝点击