精华内容
下载资源
问答
  • 线程Demo

    2017-12-07 14:09:30
    线程Demo线程Demo线程Demo线程Demo线程Demo线程Demo
  • 线程demo

    2017-07-13 21:53:24
    简单的多线程demo
  • linux多线程demo

    2021-02-18 09:44:44
    linux多线程demo 使用cmake编译
  • C#多线程Demo

    2012-04-10 10:50:40
    C#多线程Demo程序 C#多线程Demo C#多线程Demo C#多线程Demo
  • C++多线程demo

    2017-05-28 12:53:01
    一个简单的C++多线程demo
  • Delphi 多线程 DEMO

    2016-09-21 11:37:47
    通过网络的资料,自己编写的一个简单的多线程DEMO,供参考。
  • MFCACE多线程demo

    2017-11-04 19:34:50
    MFCACE多线程demo,基于ace 但是自己需要配置 C/C++属性里配置即可
  • 简单的java线程demo

    2017-08-17 20:44:28
    简单的java线程demo
  • linux c++线程demo

    2013-03-24 23:44:51
    linux c++线程demo
  • 手写多线程demo,模拟数据库练习。感谢技术分享感谢技术分享感谢技术分享..感谢技术分享感谢技术分享感谢技术分享..
  • 线程池管理线程demo

    2018-01-29 11:21:41
    线程池管理线程demo,可以参考下。比较详细。将线程任务托管给线程池,减少开销。
  • 线程DEMO

    2011-12-12 22:19:25
    简单的delphi多线程DEMO,适合初学者
  • C++11多线程demo

    2016-11-19 20:17:46
    C++11多线程demo,包含在Ubuntu下编译C++11的方法,写了两三个C++11多线程的demo,欢迎下载!
  • Delphi的线程Demo

    千次阅读 2017-02-14 16:52:04
    delphi线程demo

    File->new->Other->Thread Object

    /****************************************************************************************************/

    unit Unit1;


    interface


    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;


    type
        TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      
     TSendShThread = class(TThread)//继承类
      private
        { Private declarations }
      protected
        procedure Execute; override;
      end;

    var
      Form1: TForm1;
      SendShThread: TSendShThread;//实例化


    implementation


    {$R *.dfm}
    procedure TSendShThread.Execute;
    var i : integer;
    begin
      i:=0;
      while not Terminated do
      begin
        sleep(6000);//定时循环
             {

                     编写一

                         系列线

                             程执行

                                 的代码

                                            }
      end;
    end;


    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SendShThread:= TSendShThread.Create(True);

    {当TSendShThread的Create()被调用的时候,需要传递一个布尔型的参数CreateSuspended。如果把这个参数设为False,那么当调用Create()之后,Execute()会被自动调用,也就是自动地执行线程代码。如果该参数设为True,这样创建了线程,但是线程创建完成之后是挂起的,需要调用TSendShThread的Resume()来唤醒线程执行。}
      SendShThread.FreeOnTerminate:=True;{这可以让线程执行完毕后随即释放}
      SendShThread.Resume;{唤醒线程,跳转到线程执行方法,但是不影响主进程的执行,也就是不卡!}
    end;


    end.




    展开全文
  • Java多线程demo
  • MFC c++ vs2005 多线程 demo 实现两个线程 ,两个小球的运动
  • interrupt方法打断线程demo

    千次阅读 2020-11-21 20:08:21
    interrupt方法打断线程demo1.打断非阻塞状态的线程2.打断阻塞状态的线程 1.打断非阻塞状态的线程 package com.demo; public class InterruputDemo { public static void main(String[] args) throws ...

    1.打断非阻塞状态的线程

    package com.demo;
    
    public class InterruputDemo {
    
        public static void main(String[] args) throws InterruptedException {
            demo1();
        }
    
        /**
         *1.在main线程中调用子线程的interrupt方法,子线程中无阻塞方法
         */
        private static void demo1() throws InterruptedException {
            //子线程
            Thread t2 = new Thread(() -> {
                int count = 0;
                //开始时,中断标志为false,进入循环
                while (!Thread.currentThread().isInterrupted()) {
                    System.out.println("子线程运行中。。。" + count++);
                    System.out.println("子线程运行中。。。1");
                    System.out.println("子线程运行中。。。2");
                    System.out.println("子线程运行中。。。3");
                    System.out.println("子线程运行中。。。4");
                    System.out.println("子线程运行中。。。5");
                    System.out.println("子线程运行中。。。6");
                }
                //当main中调用了interrupt,中断标志变为true,退出循环
                System.out.println("子线程中断标志="+Thread.currentThread().isInterrupted());
            });
            t2.start();
            //主线程
            int count = 0;
            while (true) {
                //睡眠1秒,等待子线程进入睡眠
                Thread.sleep(1000);
                t2.interrupt();
                System.out.println("main运行中。。。" + count++);
            }
        }
    }
    

    运行结果:

    子线程运行中。。。6
    子线程运行中。。。7333
    子线程运行中。。。1
    子线程运行中。。。2
    子线程运行中。。。3
    子线程运行中。。。4
    子线程运行中。。。5
    子线程运行中。。。6
    子线程运行中。。。7334
    子线程运行中。。。1
    子线程运行中。。。2
    子线程运行中。。。3
    子线程运行中。。。4
    main运行中。。。0
    子线程运行中。。。5
    子线程运行中。。。6
    子线程中断标志=true
    main运行中。。。1
    main运行中。。。2
    main运行中。。。3
    main运行中。。。4
    main运行中。。。5
    main运行中。。。6
    main运行中。。。7
    

    结论:

    1. 调用了另一个线程的interrupt方法后,会将它的中断标志位设置为false(没有抛出InterruptedException 的情况下);

    2. 被打断的线程除了标志位发生变化,没有任何改变。若没有其他操作,将会顺利执行完毕线程中的代码。

    2.打断阻塞状态的线程

    package com.demo;
    
    public class InterruputDemo {
    
        public static void main(String[] args) throws InterruptedException {
            demo2();
        }
    
        /**
         *打断线程的睡眠状态
         */
        public static void demo2() throws InterruptedException {
    
            Thread t = new Thread(() -> {
                while (!Thread.currentThread().isInterrupted()) {
                    try {
                        System.out.println("子线程运行中。。。");
                        //睡眠30秒
                        Thread.sleep(30000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        //当另一个线程(main线程)调用了本线程的interrupt方法后,若本线程正在sleep则会抛出InterruptedException异常,否则啥也不会发生;
                        //只有声明了InterruptedException异常的方法才会抛出这个异常;
                        //InterruptedException被抛出后,我们检查当前线程的阻塞状态,发现是false
                        boolean interrupted1 = Thread.currentThread().isInterrupted();//false
                        System.out.println("子线程的中断状态1=" + interrupted1);
                        Thread.currentThread().interrupt();
                        boolean interrupted2 = Thread.currentThread().isInterrupted();//true
                        System.out.println("子线程的中断状态2=" + interrupted2);
                    }
                }
            });
            t.start();
    
            int count = 0;
            while (true) {
                //睡眠1秒,等待子线程进入睡眠
                Thread.sleep(1000);
                t.interrupt();
                System.out.println("main运行中。。。" + count++);
            }
        }
    }
    

    运行结果:

    子线程运行中。。。
    main运行中。。。0
    子线程的中断状态1=false
    子线程的中断状态2=true
    java.lang.InterruptedException: sleep interrupted
    	at java.lang.Thread.sleep(Native Method)
    	at com.demo.InterruputDemo.lambda$demo2$0(InterruputDemo.java:19)
    	at java.lang.Thread.run(Thread.java:748)
    main运行中。。。1
    main运行中。。。2
    main运行中。。。3
    main运行中。。。4
    

    结论:

    1. 打断阻塞状态sleep中的线程,sleep方法会抛出InterruptedException异常;
    2. 抛出InterruptedException异常时,线程的中断标志会重新设置为false;
    3. 要想通过判断中断标志退出线程循环,需要在catch中再调用一次interrupt将中断标志设置为true。这时线程并不在阻塞状态,不会抛出异常。

    总结:

    1. 中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断。
    2. Thread.interrupt()方法不会中断一个正在运行的线程。
    3. 如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该Thread类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException异常。这个时候,我们可以通过捕获InterruptedException异常来终止线程的执行,具体可以通过return等退出或改变共享变量的值使其退出。
    4. synchronized在获锁的过程中是不能被中断的,意思是说如果产生了死锁,则不可能被中断(请参考后面的测试例子)。与synchronized功能相似的reentrantLock.lock()方法也是一样,它也不可中断的,即如果发生死锁,那么reentrantLock.lock()方法无法终止,如果调用时被阻塞,则它一直阻塞到它获取到锁为止。但是如果调用带超时的tryLock方法reentrantLock.tryLock(long timeout, TimeUnit unit),那么如果线程在等待时被中断,将抛出一个InterruptedException异常,这是一个非常有用的特性,因为它允许程序打破死锁。你也可以调用reentrantLock.lockInterruptibly()方法,它就相当于一个超时设为无限的tryLock方法。
    展开全文
  • C++多线程Demo

    千次阅读 2020-07-02 11:44:06
    《C++多线程Demo》   多线程访问共享资源时,采取对资源加锁的方式来防止产生脏数据和错误。多线程访问同一个数据库时,数据库是共享资源,所以对库操作要加锁。对于操作同一个数据结构对象的时候也是一样的。 ...

    《C++多线程Demo》

      多线程访问共享资源时,采取对资源加锁的方式来防止产生脏数据和错误。多线程访问同一个数据库时,数据库是共享资源,所以对库操作要加锁。对于操作同一个数据结构对象的时候也是一样的。

    Key Words:C++多线程、map接收线程结果


    Beijing, 2020

    作者:RaySue

    Agile Pioneer  

    定义线程函数

      用map接受线程返回数据, 这里介绍一种场景比较简单的多线程结果汇总的用法,使用map对多线程的结果进行收集,在线程读写的map的时候加锁。

    #include<mutex>
    
    std::mutex mtx;
    
    void threadClsTask(int begin, int end, vector<Mat> imgList, BSMobileNet *bsMobileNet, map<int, int> *bsInfo){
        int clsRes = bsMobileNet->inference(imgList[begin]);
        mtx.lock();
        bsInfo->insert(pair<int, int>(begin, clsRes));
        mtx.unlock();
    }
    
    void threadWEBSTask(int begin, int end, vector<Mat> imgList, WEBSAlg *wsICNet, map<int, WE_BS_Res> *wsInfo){
        WE_BS_Res weBsRes;
        wsICNet->inference(imgList[begin], weBsRes);
        mtx.lock();
        wsInfo->insert(pair<int, WE_BS_Res>(begin, weBsRes));
        mtx.unlock();
    }
    

    多线程调用

    int algThreadNum = 6;
    std::thread threads[algThreadNum];
    map<int, int> *bsInfo = new map<int, int>();
    map<int, float> *wsInfo = new map<int, float>();
    
    threads[0] = thread(threadClsTask, 0, 0, imgList, &bsMobileNet1, bsInfo);
    threads[1] = thread(threadSegTask, 0, 0, imgList, &wsICNet1, wsInfo);
    
    threads[2] = thread(threadClsTask, 1, 1, imgList, &bsMobileNet2, bsInfo);
    threads[3] = thread(threadSegTask, 1, 1, imgList, &wsICNet2, wsInfo);
    
    threads[4] = thread(threadClsTask, 2, 2, imgList, &bsMobileNet3, bsInfo);
    threads[5] = thread(threadSegTask, 2, 2, imgList, &wsICNet3, wsInfo);
    
    for (auto &t : threads){
    	t.join();
    }
    
    delete bsInfo;
    delete wsInfo;
    

      多线程的互斥情况在代码编写过程中是经常遇到的。所以,每次对共享数据进行操作时,都需要对数据进行 EnterCriticalSection 和 LeaveCriticalSection 的操作。但是,这中间也不是一帆风顺的。很有可能你会遇到各种各样的错误。那么,这时候你的程序就需要跳出去了。可能一开始遇到 error 的时候,你还记得需要退出临界区。但是,如果错误多了,你未必记得还有这个操作了。这一错就完了,别的线程就没有机会获取这个锁了。

      C++ 的一个重要特点就是,不管函数什么时候退出,系统都会自动调用类的析构函数。在Process类的data_process函数中,函数在开始就创建了一个CLock类。那么,在创建这个类的时候,其实就开始了临界区的pk。那么一旦进入到临界区当中,在error中能不能及时退出临界区呢?此时,c++析构函数的优势出现了。因为不管错误什么时候出现,在函数退出之前,系统都会帮我们善后。什么善后呢?就是系统会调用CLock的析构函数,也就是退出临界区。这样,我们的目的就达到了。

    《c++并发编程实战》
    c++实现线程安全的map
    https://blog.csdn.net/eulb/article/details/2177500
    https://blog.csdn.net/zkkdcs1/article/details/89400259

    展开全文
  • QMainWindow多线程demo

    千次阅读 2017-12-12 19:33:36
    QMainWindow多线程demo


    # -*- coding: utf-8 -*-
    
    from PyQt5 import QtWidgets, QtCore
    
    import sys
    from PyQt5.QtCore import *
    import time
    
    # 继承QThread
    from PyQt5.QtWidgets import QMainWindow, QPushButton
    
    
    class Runthread(QThread):
        # python3,pyqt5与之前的版本有些不一样
        #  通过类成员对象定义信号对象
        _signal = pyqtSignal(str)
    
        def __init__(self, parent=None):
            super(Runthread, self).__init__()
    
        def __del__(self):
            self.wait()
    
        def run(self):
            # 处理你要做的业务逻辑,这里是通过一个回调来处理数据,这里的逻辑处理写自己的方法
            # wechat.start_auto(self.callback)
            for i in range(2000000):
                # 发出信号
                self._signal.emit('当前循环值为:%s' % i)
                # 让程序休眠
                time.sleep(0.5)
            # self._signal.emit("sdf");  #可以在这里写信号焕发
    
        def callback(self, msg):
            # 信号焕发,我是通过我封装类的回调来发起的
            self._signal.emit(msg);
    
    
    class mywindow(QMainWindow):
        def __init__(self):
            super(mywindow, self).__init__()
            self.setupUi()
    
    
        def setupUi(self):
            self.btn1 = QPushButton("Button 1", self)
            self.btn1.setMaximumWidth(200)
            self.btn1.move(30, 50)
            btn2 = QPushButton("Button 2", self)
            btn2.move(150, 50)
            self.btn1.clicked.connect(self.start_login)
            # self.btn1.clicked.connect(self.buttonClicked)
            btn2.clicked.connect(self.start_login)
            self.statusBar()
            self.setGeometry(300, 300, 290, 150)
            self.setWindowTitle('Event sender')
            self.show()
    
        def start_login(self):
            # 创建线程
            self.thread = Runthread()
            # 连接信号
            self.thread._signal.connect(self.callbacklog)
            # 开始线程
            self.thread.start()
    
        def callbacklog(self, msg):
            # 奖回调数据输出到文本框
            self.btn1.setText("\n"+ msg+ "   "+
                                      time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()));
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        myshow = mywindow()
        myshow.show()
        sys.exit(app.exec_())
    
    
    展开全文
  • Java多线程demo

    千次阅读 2018-05-23 20:41:17
    import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 多线程demo示例 * @since 2018-05-22 * @ve...
  • WebAssembly多线程demo

    2019-05-12 15:40:50
    WebAssembly多线程demo一、准备工作WebAssembly第一个demochrome://flags WebAssembly threads support 选项要打开 enable 二、好了,开始写demo功能:js传递给c 一个计算次数,一个启动的线程数, 打印相同计算次数...
  • java多线程demo

    2017-11-11 13:18:44
    demo包含了所有多线程操作的demo以及详细注释本demo包含了所有多线程操作的demo以及详细注释
  • C#多线程demo

    2018-01-15 15:46:48
    C# 任意设置线程数,多线程demo,欢迎大家一起探讨学习。
  • qt多线程demo.zip

    2021-04-29 15:06:27
    qt多线程编程demo,多线程编程的基础编程,开启/关闭线程
  • 线程demo.rar

    2019-07-05 08:06:46
    DEMO是用C#编写,对于编写线程有很好的参考,里面有详细的注解。
  • QT多线程DEMO.rar

    2021-04-14 10:04:03
    demo描述了QT多线的运用,包括:线程启动、线程运行、线程暂停、线程挂起、线程恢复,已经线程间的通信、线程间的消息传递等

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 192,794
精华内容 77,117
关键字:

线程demo