类的实例中的私有成员是否线程安全--实例


// 本程序用来说明 类的实例中的私有成员是否线程安全

public class Zy_thread_test1 
{

    public static void main(String[] args) 
    {

        hello  tHello=new hello(); //这里创建一个对象

         
          for(int j=0;j<5;++j)
          {
              /****************************************************************
            (1)new Thread( tHello )建立的每个线程,都运行了tHello对象的run方法,所以这些线程都可以操作 tHello对象 的私有成员i,
            所以 tHello对象 的私有成员i不是线程安全的
            (2)将new Thread( tHello ).start() 改成 new Thread( new hello() ).start();那么每个线程都运行一个新建实例的run方法,
             这时 每个线程的run方法操作的是自己实例中的私有成员i,每个实例的私有成员i互不干扰,是线程安全的
            ***************************************************************/
              
              new Thread( tHello ).start(); 
              
             // new Thread( new hello() ).start();
              
             System.out.println("====================   "  + j + "  start  ==========================" );
          }

}
    
}

 class hello implements Runnable 
{
    
    private  int i=0; // 私有成员,可能是线程安全,也可能是不安全的
    
    //public static  int i=0; //类的静态变量一定是线程不安全的
     
    public void  run() 
    {
        //int i=0;   //方法内的局部变量一定是线程安全的
        
       while(i<100)
       {
           
           try {
                 Thread.sleep(100);
                } 
           catch (InterruptedException e) 
            {
             e.printStackTrace();
            }
           
           i++;
           System.out.println(  Thread.currentThread().getName() +" --- "+  i  );
           
       }
    }
    
}
 
 
 
 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Qt创建单线程实例,可以通过继承QObject并重写run()函数来实现。 首先,我们创建一个继承自QObject的子,命名为MyThread。在MyThread的头文件,声明一个私有的QThread成员变量,以及一个run()函数的重载。 ```cpp #ifndef MYTHREAD_H #define MYTHREAD_H #include <QObject> #include <QThread> class MyThread : public QObject { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr); void start(); void stop(); signals: void finished(); private: QThread m_thread; private slots: void run(); }; #endif // MYTHREAD_H ``` 在MyThread的实现文件,我们可以在构造函数将m_thread设置为子线程,并将自身对象移到该线程执行。 ```cpp #include "mythread.h" MyThread::MyThread(QObject *parent) : QObject(parent) { moveToThread(&m_thread); } void MyThread::start() { m_thread.start(); } void MyThread::stop() { m_thread.quit(); m_thread.wait(); } void MyThread::run() { // 在这里进行单线程的运算或操作 emit finished(); } ``` 通过这种方式创建的MyThread,可以被当作一个普通的QObject对象使用。可以调用start()函数来开始运行单线程的操作,调用stop()函数来停止线程的执行。 在Qt主线程,可以通过连接MyThread对象的finished信号来获知操作已经完成。 ### 回答2: 在Qt,可以通过继承QObject并在该创建一个单独的线程实例来实现单线程的功能。 首先,在实例添加一个成员变量用于存储线程实例: ```cpp QThread* m_thread; ``` 然后,在实例的构造函数创建该线程实例,并将对象移动到该线程: ```cpp m_thread = new QThread(this); this->moveToThread(m_thread); ``` 接下来,在实例的析构函数释放线程资源: ```cpp m_thread->quit(); m_thread->wait(); delete m_thread; ``` 最后,在实例添加一个槽函数,用于处理单线程执行的具体逻辑: ```cpp void MyObject::run() { // 执行单线程逻辑 } ``` 在实际使用时,可以通过信号槽机制将其他对象的信号与此槽函数连接起来,触发单线程的执行: ```cpp MyObject myObject; QTimer::singleShot(0, &myObject, SLOT(run())); ``` 以上就是在Qt实例创建一个单线程的方法。通过使用QThread和信号槽机制,可以实现简单而有效的单线程执行。 ### 回答3: 在QT创建一个单线程可以通过以下步骤实现: 1. 首先,我们需要在主函数初始化QT应用程序对象,代码如下: ``` #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 其他代码 return a.exec(); } ``` 2. 创建一个继承自QObject的,作为单线程实例,代码如下: ``` #include <QObject> class MyThread : public QObject { Q_OBJECT public: MyThread(QObject *parent = nullptr); void run(); signals: // 自定义信号 public slots: // 自定义槽函数 }; MyThread::MyThread(QObject *parent) : QObject(parent) { // 构造函数 } void MyThread::run() { // 线程的实际工作 } ``` 3. 在主函数创建单线程实例并启动线程,代码如下: ``` #include "mythread.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MyThread thread; // 连接信号和槽 QThread workerThread; thread.moveToThread(&workerThread); QObject::connect(&workerThread, SIGNAL(started()), &thread, SLOT(run())); workerThread.start(); // 其他代码 return a.exec(); } ``` 通过以上步骤,我们可以在QT实例成功创建一个单线程。在MyThread的run()函数可以编写实际的线程工作任务。通过workerThread.start()启动线程,在线程开始执行时,自动调用MyThread对象的run()函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值