C#暂停线程和恢复的实现方法:
.NET 基础类库的System.Threading命名空间提供了大量的类和接口支持多线程。这个命名空间有很多的类。System.Threading.Thread类是创建并控制线程,设置其优先级并获取其状态最为常用的类。他有很多的方法,在这里我们将就比较常用和重要的方法做一下介绍:
Thread.Start():启动线程的执行;
Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;
Thread.Resume():继续已挂起的线程;
Thread.Interrupt():中止处于 Wait或者Sleep或者Join 线程状态的线程;
Thread.Join():阻塞调用线程,直到某个线程终止时为止
Thread.Sleep():将当前线程阻塞指定的毫秒数;
Thread.Abort():以开始终止此线程的过程。如果线程已经在终止,则不能通过Thread.Start()来启动线程。
</>code
- private void GetBidList()
- {
- Console.WriteLine("-----------www.itsvse.com------");
- while (true)
- {
- Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
- Thread.Sleep(1000);
- }
- }
- private void button1_Click(object sender, EventArgs e)
- {
- if (GET_LIST.ThreadState == (ThreadState.Suspended | ThreadState.Background))
- {
- GET_LIST.Resume();
- Console.WriteLine("线程继续");
- }
- else
- {
- GET_LIST.Start();
- Console.WriteLine("线程开始");
- }
- }
- private void button2_Click(object sender, EventArgs e)
- {
- GET_LIST.Suspend();
- Console.WriteLine("线程挂起");
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- GET_LIST = new Thread(new ThreadStart(GetBidList)) { IsBackground = true };
- }
另外我们可以通过ManualResetEvent类来实现。
声明, 初始化时不执行
private static ManualResetEvent _eventWorkList = new ManualResetEvent(false);
Thead里的信号等待, 放在要控制的线程内, 当外部调用Reset时,线程暂停;当外部调用Set时,线程继续执行;
_eventWorkList.WaitOne();
暂停线程
// Pause the WorkList operation.
_eventWorkList.Reset();
恢复线程
// Resume WorkList
_eventWorkList.Set();
</>code
- using System;
- using System.Text;
- using System.Windows.Forms;
- using System.Threading;
- namespace WindowsApplication1
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- Thread th = new Thread(YourThread);
- th.Start();
- }
- private void textBox1_TextChanged(object sender, EventArgs e)
- {
- if (textBox1.Text.Length >= 4)
- {
- detailCollectedEvent.Set(); // 当textBox1的文本超过4位,发一个通知
- }
- }
- AutoResetEvent detailCollectedEvent = new AutoResetEvent(false);
- void YourThread()
- {
- MessageBox.Show("input you bank account details into the textbox");
- detailCollectedEvent.WaitOne(); // 等候通知
- MessageBox.Show("we will keep the secret.");
- }
- }
- }
java 线程的开始、暂停、继续
Android项目中的一个需求:通过线程读取文件内容,并且可以控制线程的开始、暂停、继续,来控制读文件。在此记录下。
直接在主线程中,通过wait、notify、notifyAll去控制读文件的线程(子线程),报错:java.lang.IllegalMonitorStateException。
需要注意的几个问题:
1.任何一个时刻,对象的控制权(monitor)只能被一个线程拥有。
2.无论是执行对象的wait、notify还是notifyAll方法,必须保证当前运行的线程取得了该对象的控制权(monitor)。
3.如果在没有控制权的线程里执行对象的以上三种方法,就会报错java.lang.IllegalMonitorStateException。
4.JVM基于多线程,默认情况下不能保证运行时线程的时序性。
线程取得控制权的3种方法:
1.执行对象的某个同步实例方法。
2.执行对象对应类的同步静态方法。
3.执行对该对象加同步锁的同步块。
这里将开始、暂停、继续封装在线程类中,直接调用该实例的方法就行。
</>code
- public class ReadThread implements Runnable{
- public Thread t;
- private String threadName;
- boolean suspended=false;
- public ReadThread(String threadName){
- this.threadName=threadName;
- System.out.println("Creating " + threadName );
- }
- public void run() {
- for(int i = 10; i > 0; i--) {
- System.out.println("Thread: " + threadName + ", " + i);
- // Let the thread sleep for a while.
- try {
- Thread.sleep(300);
- synchronized(this) {
- while(suspended) {
- wait();
- }
- }
- } catch (InterruptedException e) {
- System.out.println("Thread " + threadName + " interrupted.");
- e.printStackTrace();
- }
- System.out.println("Thread " + threadName + " exiting.");
- }
- }
- /**
- * 开始
- */
- public void start(){
- System.out.println("Starting " + threadName );
- if(t==null){
- t=new Thread(this, threadName);
- t.start();
- }
- }
- /**
- * 暂停
- */
- void suspend(){
- suspended = true;
- }
- /**
- * 继续
- */
- synchronized void resume(){
- suspended = false;
- notify();
- }
- }
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛