操作线程的方法
来源:互联网 发布:乐视软件商城 编辑:程序博客网 时间: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 时 间 片 来 执 行 。
- 操作线程的方法
- 线程操作的方法
- 操作线程的方法
- Java 线程操作的相关方法
- C#跨线程操作控件的线程安全方法
- C# 跨线程操作控件的线程安全性方法
- C#跨线程操作控件的线程安全方法
- 工作线程操作UI线程元素的方法
- 线程服务ExecutorService的操作shutdown方法和shutdownNow方法
- Java 线程的基本概念 创建方法 和 基本操作
- 关于线程间操作无效的处理方法
- 关于线程间操作无效的处理方法
- 总结4种线程中操作UI界面的方法
- 4种线程中操作UI界面的方法
- 总结4种线程中操作UI界面的方法
- 总结4种线程中操作UI界面的方法
- 4种在线程中操作UI的方法
- 总结4种线程中操作UI界面的方法
- nyoj 44子串和
- 好好理解一下CMS收集器
- asp.net mvc post请求断点调试
- MFC动态创建可停靠窗口,窗口添加控件并读写控件中的数据
- hdu6053-容斥+莫比乌斯函数+优化
- 操作线程的方法
- spark 之 Phoenix详解
- mysql 获取当前日期前一天
- python 日期API
- [3-02]大型网站及其架构演进过程
- Validate Binary Search Tree
- 安装slowhttptest各种问题解决方案
- 微信js-sdk分享详解及demo实例
- hdu1754 I Hate It