创建线程的几种方式(代码示例)

 
      


#region 方式2-1 启动线程(带输入参数的)

private void btn1_Click(object sender, EventArgs e)
{
MyObject obj = new MyObject(1, 2);//或者使用全局变量代替obj
Thread thread = new Thread(obj.FunctionName);
thread.Start();
}

public class MyObject
{
public int a1, b1;

public MyObject(int a, int b)
{
a1 = a;
b1 = b;
}

public void FunctionName()
{
MessageBox.Show("a:" + a1 + ",b:" + b1);
}
}
#endregion

#region 方式2-2 启动线程(带输入参数的)

private void btn2_Click(object sender, EventArgs e)
{
//这个Thread类的构造方法的定义如下:
Thread thread = new Thread(myStaticParamThreadMethod);
thread.Start("通过委托的参数传值");
}

public static void myStaticParamThreadMethod(Object obj)
{
MessageBox.Show(obj.ToString());
}

//[ComVisibleAttribute(false)]
//public delegate void ParameterizedThreadStart(Object obj);

//public Thread(ParameterizedThreadStart start);

#endregion


#region 方式3 线程池技术

RegisteredWaitHandle RW;

private void btn3_Click(object sender, EventArgs e)
{
//ThreadPool.QueueUserWorkItem((objState) =>
//{
// //do something.. //from the thread pool.
//}, null);

RW = ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(test), state, 1000, false);
wait.Set();
}

AutoResetEvent wait = new AutoResetEvent(false);
object state = new object();

int count = 0;

/// <summary>
/// 会定时反复调用
/// </summary>
private void test(object state, bool timedOut)
{
SetText(DateTime.Now.ToString());
count++;

if (count > 5) RW.Unregister(wait);//执行5次后,退出
}

/// <summary>
/// 调用UI线程,修改界面数据
/// </summary>
public void SetText(string argText)
{
if (lblResult.InvokeRequired)
{
lblResult.Invoke(new SetTextDelegateMethod(SetText), new[] { argText });
}
else
lblResult.Text = argText;
}
public delegate void SetTextDelegateMethod(string argText);

#endregion

#region 方式4 使用BackgroundWorker

//支持:报告进度、支持完成回调、取消任务、暂停任务等

private BackgroundWorker Worker;

private void btn4_Click(object sender, EventArgs e)
{
Worker = new BackgroundWorker();
Worker.WorkerReportsProgress = true;
Worker.WorkerSupportsCancellation = true;
Worker.DoWork += worker_DoWork;
Worker.ProgressChanged += worker_ProgressChanged;
Worker.RunWorkerCompleted += worker_RunWorkerCompleted;
Worker.RunWorkerAsync();
}

/// <summary>
/// 异步执行完毕,回到UI线程
/// </summary>
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled) lblResult.Text = "取消成功!";
else lblResult.Text = "执行完成!";

测试捕获异常
//if (e.Error != null && !string.IsNullOrEmpty(e.Error.Message)) lblResult.Text = e.Error.Message;

//借助AsyncOperation.Post(SendOrPostCallback d, object arg),
//在winform下使用这个函数,使得由SendOrPostCallback定义被封送回UI线程
}

private void btn4Abort_Click(object sender, EventArgs e)
{
Worker.CancelAsync();
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker _worker = sender as BackgroundWorker;
for (int i = 1; i < 101; i++)
{
_worker.ReportProgress(i, "执行到第" + i + "个");
Thread.Sleep(100);

//此时在非UI线程中执行代码,执行下行代码会出错
//lblResult.Text = "aaa"; //线程间操作无效: 从不是创建控件“lblResult”的线程访问它。

//这里判断一下是否用户要求取消后台进行,并可以尽早退出
if (_worker.CancellationPending)
{
e.Cancel = true;
return;
}

测试捕获异常
//if (i == 35) throw new Exception("在执行到i=" + i + "时候出错!");
}
}

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.lblResult.Text = e.ProgressPercentage.ToString() + " " + e.UserState;
}

#endregion


namespace WinFormsApp_CreateAThread
{
partial class Form1
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows 窗体设计器生成的代码

/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.btn1 = new System.Windows.Forms.Button();
this.btn2 = new System.Windows.Forms.Button();
this.btn3 = new System.Windows.Forms.Button();
this.lblResult = new System.Windows.Forms.Label();
this.btn4 = new System.Windows.Forms.Button();
this.btn4Abort = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// btn1
//
this.btn1.Location = new System.Drawing.Point(24, 99);
this.btn1.Name = "btn1";
this.btn1.Size = new System.Drawing.Size(141, 44);
this.btn1.TabIndex = 0;
this.btn1.Text = "创建线程并带参数传值1";
this.btn1.UseVisualStyleBackColor = true;
this.btn1.Click += new System.EventHandler(this.btn1_Click);
//
// btn2
//
this.btn2.Location = new System.Drawing.Point(24, 174);
this.btn2.Name = "btn2";
this.btn2.Size = new System.Drawing.Size(141, 39);
this.btn2.TabIndex = 1;
this.btn2.Text = "创建线程并带参数传值2";
this.btn2.UseVisualStyleBackColor = true;
this.btn2.Click += new System.EventHandler(this.btn2_Click);
//
// btn3
//
this.btn3.Location = new System.Drawing.Point(211, 174);
this.btn3.Name = "btn3";
this.btn3.Size = new System.Drawing.Size(131, 39);
this.btn3.TabIndex = 2;
this.btn3.Text = "通过线程池创建线程3";
this.btn3.UseVisualStyleBackColor = true;
this.btn3.Click += new System.EventHandler(this.btn3_Click);
//
// lblResult
//
this.lblResult.AutoSize = true;
this.lblResult.Location = new System.Drawing.Point(236, 115);
this.lblResult.Name = "lblResult";
this.lblResult.Size = new System.Drawing.Size(41, 12);
this.lblResult.TabIndex = 3;
this.lblResult.Text = "label1";
//
// btn4
//
this.btn4.Location = new System.Drawing.Point(211, 236);
this.btn4.Name = "btn4";
this.btn4.Size = new System.Drawing.Size(150, 44);
this.btn4.TabIndex = 4;
this.btn4.Text = "使用BackgroundWorker 4";
this.btn4.UseVisualStyleBackColor = true;
this.btn4.Click += new System.EventHandler(this.btn4_Click);
//
// btn4Abort
//
this.btn4Abort.Location = new System.Drawing.Point(211, 286);
this.btn4Abort.Name = "btn4Abort";
this.btn4Abort.Size = new System.Drawing.Size(150, 44);
this.btn4Abort.TabIndex = 5;
this.btn4Abort.Text = "4 取消当前操作";
this.btn4Abort.UseVisualStyleBackColor = true;
this.btn4Abort.Click += new System.EventHandler(this.btn4Abort_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(399, 339);
this.Controls.Add(this.btn4Abort);
this.Controls.Add(this.btn4);
this.Controls.Add(this.lblResult);
this.Controls.Add(this.btn3);
this.Controls.Add(this.btn2);
this.Controls.Add(this.btn1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
this.PerformLayout();

}

#endregion

private System.Windows.Forms.Button btn1;
private System.Windows.Forms.Button btn2;
private System.Windows.Forms.Button btn3;
private System.Windows.Forms.Label lblResult;
private System.Windows.Forms.Button btn4;
private System.Windows.Forms.Button btn4Abort;
}
}


posted on 2014-03-05 23:34  v.e.n.u.s 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/jx270/p/3583614.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,有以下几种方式可以创建线程: 1. 继承Thread类: 这是一种创建线程的最简单方式。通过继承Thread类,并重写其run()方法来定义线程的执行逻辑。然后可以创建Thread的实例并调用start()方法来启动线程示例代码: ```java class MyThread extends Thread { @Override public void run() { // 线程执行的逻辑代码 } } public class Main { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); } } ``` 2. 实现Runnable接口: 这是另一种创建线程方式。通过实现Runnable接口,并实现其run()方法来定义线程的执行逻辑。然后可以创建Thread的实例,并将实现了Runnable接口的对象作为参数传递给Thread的构造方法来创建线程示例代码: ```java class MyRunnable implements Runnable { @Override public void run() { // 线程执行的逻辑代码 } } public class Main { public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start(); } } ``` 3. 使用匿名内部类: 如果线程逻辑比较简单,可以使用匿名内部类的方式创建线程示例代码: ```java public class Main { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { // 线程执行的逻辑代码 } }); thread.start(); } } ``` 4. 使用线程池: 线程池是一种管理线程的机制,通过线程池可以有效地重用线程,避免频繁地创建和销毁线程。Java提供了Executor框架来实现线程池的管理。 示例代码: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(5); executorService.execute(new Runnable() { @Override public void run() { // 线程执行的逻辑代码 } }); executorService.shutdown(); } } ``` 通过以上几种方式,我们可以在Java中创建并启动线程,实现多线程的并发执行。根据具体的需求和场景,选择适合的方式创建线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值