我现在不知道是一个线程任务对象实现的接口是使用一个对象还是多个线程任务对象实现的接口是共

WFP做的程序,调用线程无法访问此对象,因为另一个线程拥有该对象_百度知道
WFP做的程序,调用线程无法访问此对象,因为另一个线程拥有该对象
WFP做的程序,调用线程无法访问此对象,因为另一个线程拥有该对象哪个大神帮我看看啊...
WFP做的程序,调用线程无法访问此对象,因为另一个线程拥有该对象哪个大神帮我看看啊
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
可爱dannieuh
可爱dannieuh
采纳数:87
获赞数:94
擅长:暂未定制
    出现上面的异常是因为多个线程在同时访问一个对象造成的,在网上查看了一些资料,说的是在C#2005后不再支持多线程直接访问界面的控件(界面创建线程与访问线程不是同一个线程),但是可以可以使用delegate来解决。  相应的解决方法如下:  WPF:Dispatcher.Invoke 方法,只有在其上创建 Dispatcher 的线程才可以直接访问DispatcherObject。若要从不同于在其上创建 DispatcherObject 的线程的某个线程访问 DispatcherObject,请对与 DispatcherObject 关联的 Dispatcher 调用 Invoke 或 BeginInvoke。需要强制线程安全的 DispatcherObject 的子类可以通过对所有公共方法调用 VerifyAccess 来强制线程安全。这样可以保证调用线程是在其上创建 DispatcherObject 的线程。  代码:  this.lbl.Dispatcher.Invoke(new Action(()={ this.lbl.Text = this is a test!!!; }));  this.lbl.Dispatcher.Invoke(new Action(()={ this.lbl.Text = this is a test!!!; }));  Winfrom:Control.Invoke 方法 (Delegate),在拥有此控件的基础窗口句柄的线程上执行指定的委托。  代码:  this.lbl.Invoke(new Action(()={ this.lbl.Text = this is a test!!!; }));  所以可以按照下面这样(修改theout方法的内容)来解决刚才的问题:publicvoidtheout(objectsource,System.Timers.ElapsedEventArgse){this.gcc1.Dispatcher.Invoke(newAction(delegate{if(this.gcc1.Offset&1){this.gcc1.Offset+=0.1;}else{this.gcc1.Offset=0;}}));this.gcc2.Dispatcher.Invoke(newAction(delegate{if(this.gcc2.Offset&1){this.gcc2.Offset+=0.1;}else{this.gcc2.Offset=0;}}));}  这样就可以解决调用线程无法访问此对象,因为另一个线程拥有该对象的问题请说明为什么
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C++ 中怎样在一个类对象中使用多线程
[问题点数:20分,结帖人wfh2015]
本版专家分:0
结帖率 75%
CSDN今日推荐
本版专家分:0
本版专家分:15068
2015年10月 C/C++大版内专家分月排行榜第二
2015年12月 C/C++大版内专家分月排行榜第三2015年11月 C/C++大版内专家分月排行榜第三
本版专家分:0
本版专家分:8114
2015年10月 C/C++大版内专家分月排行榜第三
本版专家分:0
本版专家分:6725
2015年6月 C/C++大版内专家分月排行榜第三
本版专家分:0
本版专家分:8114
2015年10月 C/C++大版内专家分月排行榜第三
本版专家分:0
本版专家分:0
本版专家分:2611
2016年8月 Linux/Unix社区大版内专家分月排行榜第一2016年6月 Linux/Unix社区大版内专家分月排行榜第一2016年5月 Linux/Unix社区大版内专家分月排行榜第一2016年4月 Linux/Unix社区大版内专家分月排行榜第一
本版专家分:4161
2015年2月 VC/MFC大版内专家分月排行榜第一
2015年1月 VC/MFC大版内专家分月排行榜第三
本版专家分:0
匿名用户不能发表回复!
其他相关推荐
多线程并发设计,了解如何创建线程,开启线程,等待线程,怎样在程序中启动一个可执行文件
C中的继承和多态
C语言有多态和继承的特性。我们简单的使用函数指针创建一个VTable和在基类和派生类对象中交叉维护引用。用这些简单的步骤,我们在C中可以实现继承和多态。
因为自己在定义全局的类对象时吃了不少苦头,许多细节方面没注意除了错,就在这里记一下。
这个方法是我的老师教我的,先添加ExPara.h的头文件和ExPara.cpp的文件,然后在ExPara.cpp里面写需要定义的类对象,如类为CDlgStudengt, 则在Expara.cpp里面添加CDlgS 然后在Expara下面进行声明:extern CDlgStu
C/S架构与多进程多线程
如题,C/S架构指的是服务器(Server)与客户机(Client)协作完成网络程序功能的一种模式。它是已经在计算机世界活跃数十年的一种古老的软件架构。如今已渗入到各领域IT系统中。其模型如下所示。
本文从以下3个方面阐述C/S架构软件设计与多进程多线程实现多任务框架。
1.C/S工作原理
2.多任务设计
3.多进程与多线程
项目中需要一个链表,线程A进行入队操作,线程B进行查询出队操作,同时不希望线程B在队列为空时阻塞,降低cpu负载,因此考虑用pthread_cond_wait进行实现:
主要实现功能:
1)出队和入队的加锁
2)当有元素入队时唤醒线程B
3)队列为空时线程B进入休眠
C++ SetTimer
多媒体计时器和多线程计时器的使用
SetTimer的使用
软件定时器和多线程在控制工程中有着非常广泛的使用,主要是因为在控制过程中,会出现大量的Socket通信和串口通信数据量,仔细想了想,觉得这两样东西还是有比较的价值的,很多初学者(我也是。。。)可能会在这两样东西上困惑,现简单比较一下。
首先注意: 线程消息队列中WM_PAINT
前言有很多时候,我们希望可以在C++类里面对那些比较耗时的函数使用多线程技术,但是熟悉C++对象语法的人应该知道,C++类的成员函数的函数指针不能直接做为参数传到pthread_create,主要因为是C++成员函数指针带有类命名空间,同时成员函数末尾是会被C++编译器加上可以接收对象地址的this指针参数。因此需要将成员函数做一定的转化,将其转化为不被编译器加上this指针,而由我们自己来为该函数
一组并发线程运行在一个进程的上下文中,每个线程都有它自己独立的线程上下文,例如:栈、程序计数器、线程ID、条件码等,每个线程和其它的线程一起共享除此之外的进程上下文的剩余部分,包括整个用户的虚拟地址空间,当然也共享同样的打开的文件的集合。,这里有一点要特别注意,就是寄存器是从不共享的,而虚拟存储器总是共享的。
有了共享就要防止在对共享变量进行操作的过程中得到一个不可知的值,在Linux内核中
#include #include #define
unsigned int#define m_ERROR(format, args...)
printf(format, ## args);//fflush(stdout);static pthread_t
g_pthread_static pthread_t
g_pthread_static pthread_t
今天想把之前的c代码改成纯c++的,一个问题就是如何动态定义数组
准备采用容器vector,类似数组之类的还好说,但是当我希望定义类类型的vector时就有点儿不知道怎么解决了
经过思考,一个很好的方法就是利用vector的模板特性,直接push一个类类型进去,例如:Qt对线程提供了支持,基本形式有独立于平台的线程类、线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法。
这个文档是提供给那些对多线程编程有丰富的知识和经验的听众的。推荐阅读:
警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心类(比如,QProcess)和网络类都不是线程安全的。
QRegExp使用一个静态缓存并且也不是线程安全的,即使通过使用QMutex来保护的QRegExp对象。
最重要的类是QThread,也就是说要开始一个新的线程,就是开始执行你重新实现的QThread::run()。这和Java的线程类很相似。
为了写线程程序,在两个线程同时希望访问同一个数据时,对数据进行保护是很必要的。因此这里也有一个QMutex类,一个线程可以锁定互斥量,并且在它锁定之后,其它线程就不能再锁定这个互斥量了,试图这样做的线程都会被阻塞直到互斥量被释放。例如:
class MyClass
void doStuff( int );
& private:
// 这里设置a为c,b为c*2。
void MyClass::doStuff( int c )
mutex.lock();
b = c * 2;
mutex.unlock();
这保证了同一时间只有一个线程可以进入MyClass::doStuff(),所以b将永远等于c * 2。
另外一个线程也需要在一个给定的条件下等待其它线程的唤醒,QWaitCondition类就被提供了。线程等待的条件QWaitCondition指出发生了什么事情,阻塞将一直持续到这种事情发生。当某种事情发生了,QWaitCondition可以唤醒等待这一事件的线程之一或全部。(这和POSIX线程条件变量是具有相同功能的并且它也是Unix上的一种实现。)例如:
#include &qapplication.h&
#include &qpushbutton.h&
// 全局条件变量
&// Worker类实现
&class Worker : public QPushButton, public QThread
& Q_OBJECT
&Worker(QWidget *parent = 0, const char *name = 0)
: QPushButton(parent, name)
setText("Start Working");
// 连接从QPushButton继承来的信号和我们的slotClicked()方法
connect(this, SIGNAL(clicked()), SLOT(slotClicked()));
& // 调用从QThread继承来的start()方法&&这将立即开始线程的执行
& QThread::start();
public slots:
&void slotClicked()
// 唤醒等待这个条件变量的一个线程
mycond.wakeOne();
protected:
&void run()
// 这个方法将被新创建的线程调用&&
& while ( TRUE ) {
// 锁定应用程序互斥锁,并且设置窗口标题来表明我们正在等待开始工作
qApp-&lock();
setCaption( "Waiting" );
qApp-&unlock();
& // 等待直到我们被告知可以继续
& mycond.wait();
& // 如果我们到了这里,我们已经被另一个线程唤醒&&让我们来设置标题来表明我们正在工作
& qApp-&lock();
& setCaption( "Working!" );
& qApp-&unlock();
// 这可能会占用一些时间,几秒、几分钟或者几小时等等,因为这个一个和GUI线程分开的线程,在处理事件时,GUI线程不会停下来&&
do_complicated_thing();
// 主线程&&所有的GUI事件都由这个线程处理。
int main( int argc, char **argv )
QApplication app( argc, argv );
// 创建一个worker&&当我们这样做的时候,这个worker将在一个线程中运行
Worker firstworker( 0, "worker" );
&app.setMainWidget( &worker );
& worker.show();
return app.exec();
只要你按下按钮,这个程序就会唤醒worker线程,这个线程将会进行并且做一些工作并且然后会回来继续等待被告知做更多的工作。如果当按钮被按下时,worker线程正在工作,那么就什么也不会发生。当线程完成了工作并且再次调用QWaitCondition::wait(),然后它就会被开始。
线程安全的事件传递
在Qt中,一个线程总是一个事件线程&&确实是这样的,线程从窗口系统中拉出事件并且把它们分发给窗口部件。静态方法QThread::postEvent从线程中传递事件,而不同于事件线程。事件线程被唤醒并且事件就像一个普通窗口系统事件那样在事件线程中被分发。例如,你可以强制一个窗口部件通过如下这样做的一个不同的线程来进行重绘:
& QWidget *
& QThread::postEvent( mywidget, new QPaintEvent( QRect(0, 0, 100, 100) ) );
这(异步地)将使mywidget重绘一块100*100的正方形区域。
Qt库互斥量
Qt库互斥量提供了从线程而不是事件线程中调用Qt方法的一种方法。例如:
&QApplication *qA
&QWidget *
qApp-&lock();
&mywidget-&setGeometry(0,0,100,100);
p.begin(mywidget);
p.drawLine(0,0,100,100);
qApp-&unlock();
在Qt中没有使用互斥量而调用一个函数通常情况下结果将是不可预知的。从另外一个线程中调用Qt的一个GUI相关函数需要使用Qt库互斥量。在这种情况下,所有可能最终访问任何图形或者窗口系统资源的都是GUI相关的。使用容器类,字符串或者输入/输出类,如果对象只被一个线程使用就不需要任何互斥量了。
当进行线程编程时,需要注意的一些事情:
当使用Qt库互斥量的时候不要做任何阻塞操作。这将会冻结事件循环。
确认你锁定一个递归QMutex的次数和解锁的次数一样,不能多也不能少。
在调用除了Qt容器和工具类的任何东西之前锁定Qt应用程序互斥量。
谨防隐含地共享类,你应该避免在线程之间使用操作符=()来复制它们。这将会在Qt的未来主要的或次要的发行版本中进行改进。
谨防那些没有被设计为线程安全的Qt类,例如,QPtrList的应用程序接口就不是线程安全的并且如果不同的线程需要遍历一个QPtrList,它们应该在调用QPtrList::first()之前锁定并且在到达终点之后解锁,而不是在QPtrList::next()的前后进行锁定和解锁。
确认只在GUI线程中创建的继承和使用了QWidget、QTimer和QSocketNotifier的对象。在一些平台上,在某个不是GUI线程的线程中创建这样的对象将永远不会接受到底层窗口系统的事件。
和上面很相似,只在GUI线程中使用QNetwork类。一个经常被问到的问题是一个QSocket是否可以在多线程中使用。这不是必须得,因为所有的QNetwork类都是异步的。
不要在不是GUI线程的线程中试图调用processEvents()函数。这也包括QDialog::exec()、QPopupMenu::exec()、QApplication::processEvents()和其它一些。
在你的应用程序中,不要把普通的Qt库和支持线程的Qt库混合使用。这也就是说如果你的程序使用了支持线程的Qt库,你就不应该连接普通的Qt库、动态的载入普通Qt库或者动态地连接其它依赖普通Qt库的库或者插件。在一些系统上,这样做会导致Qt库中使用的静态数据变得不可靠了。
QT通过三种形式提供了对线程的支持。它们分别是,一、平台无关的线程类,二、线程安全的事件投递,三、跨线程的信号-槽连接。这使得开发轻巧的多线程 Qt程序更为容易,并能充分利用多处理器机器的优势。多线程编程也是一个有用的模式,它用于解决执行较长时间的操作而不至于用户界面失去响应。Qt 线程类Qt 包含下面一些线程相关的类:QThread 提供了开始一个新线程的方法QThreadStorage 提供逐线程数据存储QMutex 提供相互排斥的锁,或互斥量QMutexLocker 是一个便利类,它可以自动对QMutex加锁与解锁QReadWriteLock 提供了一个可以同时读写操作的锁QReadLocker与QWriteLocker 是便利类,它自动对QReadWriteLock加锁与解锁QSemaphore 提供了一个整型信号量,是互斥量的泛化QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。
Qt 高级线程类QtConcurrent 开启线程事务QFutureWatcher 观测线程状态QFuture 线程启动类QThread创建线程为创建一个线程,子类化QThread并且重写它的run()函数,例如:class MyThread : public QThread&{& & &Q_OBJECT&protected:& & &void run();&};&void MyThread::run()&{& & &...&}
之后调用start,Qt即可创建一个线程,并在线程中执行run()函数中代码,注意UI非线程安全的。
QtConcurrent创建线程QtConcurrent 创建线程的方法比较多, 而且QtConcurrent 本身比较特殊,若系统有空闲线程时,它会调度空闲线程,无空闲线程时将会创建一个线程。(注意:QtConcurrent 创建线程归QthreadPool管理,若超过最大线程数,将会进入队列等待),QtConcurrent创建线程的方法多种,以下举例map函数:QImage scale(const QImage &image)&{& & &qDebug() & & "Scaling image in thread" && QThread::currentThread();& & &return image.scaled(QSize(100, 100), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);&}&&int main(int argc, char *argv[])&{& & &QApplication app(argc, argv);&& & &const int imageCount = 20;&& & &// Create a list containing imageCount images.& & &QL& & &for (int i = 0; i & imageC ++i)& & & & &images.append(QImage(, QImage::Format_ARGB32_Premultiplied));&& & &// Use QtConcurrentBlocking::mapped to apply the scale function to all the& & &// images in the list.& & &QList thumbnails = QtConcurrent::blockingMapped(images, scale);&& & &return 0;&}Qt 线程同步QMutex, QReadWriteLock, QSemaphore, QWaitCondition 提供了线程同步的手段。使用线程的主要想法是希望它们可以尽可能并发执行,而一些关键点上线程之间需要停止或等待。例如,假如两个线程试图同时访问同一个 全局变量,结果可能不如所愿。QMutexQMutex 提供相互排斥的锁,或互斥量。在一个时刻至多一个线程拥有mutex,假如一个线程试图访问已经被锁定的mutex,那么它将休眠,直到拥有mutex的线程对此mutex解锁。Mutexes常用来保护共享数据访问。QReadWriterLockQReadWriterLock 与QMutex相似,除了它对 &read&,&write&访问进行区别对待。它使得多个读者可以共时访问数据。使用QReadWriteLock而不是QMutex,可以使得多线程程序更具有并发性。&QReadWriteL&void ReaderThread::run()&{& & &lock.lockForRead();& & &read_file();& & &lock.unlock();&}&void WriterThread::run()&{& & &lock.lockForWrite();& & &write_file();& & &lock.unlock();&}
QSemaphoreQSemaphore 是QMutex的一般化,它可以保护一定数量的相同资源,与此相对,一个mutex只保护一个资源。下面例子中,使用QSemaphore来控制对环状缓 冲的访问,此缓冲区被生产者线程和消费者线程共享。生产者不断向缓冲写入数据直到缓冲末端,再从头开始。消费者从缓冲不断读取数据。信号量比互斥量有更好 的并发性,假如我们用互斥量来控制对缓冲的访问,那么生产者,消费者不能同时访问缓冲。然而,我们知道在同一时刻,不同线程访问缓冲的不同部分并没有什么 危害。&const int DataSize = 100000;&const int BufferSize = 8192;&char buffer[BufferSize];&&QSemaphore freeBytes(BufferSize);&QSemaphore usedB&&class Producer : public QThread&{&public:& & &void run();&};&&void Producer::run()&{& & &qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));& & &for (int i = 0; i & DataS ++i) {& & & & &freeBytes.acquire();& & & & &buffer[i % BufferSize] = "ACGT"[(int)qrand() % 4];& & & & &usedBytes.release();& & &}&}&&class Consumer : public QThread&{&public:& & &void run();&};&&void Consumer::run()&{& & &for (int i = 0; i & DataS ++i) {& & & & &usedBytes.acquire();& & & & &fprintf(stderr, "%c", buffer[i % BufferSize]);& & & & &freeBytes.release();& & &}& & &fprintf(stderr, "\n");&}&&int main(int argc, char *argv[])&{& & &QCoreApplication app(argc, argv);& & &P& & &C& & &producer.start();& & &consumer.start();& & &producer.wait();& & &consumer.wait();& & &return 0;&}
QWaitConditionQWaitCondition 允许线程在某些情况发生时唤醒另外的线程。一个或多个线程可以阻塞等待一QWaitCondition ,用wakeOne()或wakeAll()设置一个条件。wakeOne()随机唤醒一个,wakeAll()唤醒所有。下面的例子中,生产者首先必须检查缓冲是否已满(numUsedBytes==BufferSize),如果是,线程停下来等待 bufferNotFull条件。如果不是,在缓冲中生产数据,增加numUsedBytes,激活条件 bufferNotEmpty。使用mutex来保护对numUsedBytes的访问。另外,QWaitCondition::wait() 接收一个mutex作为参数,这个mutex应该被调用线程初始化为锁定状态。在线程进入休眠状态之前,mutex会被解锁。而当线程被唤醒 时,mutex会处于锁定状态,而且,从锁定状态到等待状态的转换是原子操作,这阻止了竞争条件的产生。当程序开始运行时,只有生产者可以工作。消费者被 阻塞等待bufferNotEmpty条件,一旦生产者在缓冲中放入一个字节,bufferNotEmpty条件被激发,消费者线程于是被唤醒。&const int DataSize = 100000;&const int BufferSize = 8192;&char buffer[BufferSize];&&QWaitCondition bufferNotE&QWaitCondition bufferNotF&QM&int numUsedBytes = 0;&&class Producer : public QThread&{&public:& & &void run();&};&&void Producer::run()&{& & &qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));&& & &for (int i = 0; i & DataS ++i) {& & & & &mutex.lock();& & & & &if (numUsedBytes == BufferSize)& & & & & & &bufferNotFull.wait(&mutex);& & & & &mutex.unlock();&& & & & &buffer[i % BufferSize] = "ACGT"[(int)qrand() % 4];&& & & & &mutex.lock();& & & & &++numUsedB& & & & &bufferNotEmpty.wakeAll();& & & & &mutex.unlock();& & &}&}&&class Consumer : public QThread&{&public:& & &void run();&};&&void Consumer::run()&{& & &for (int i = 0; i & DataS ++i) {& & & & &mutex.lock();& & & & &if (numUsedBytes == 0)& & & & & & &bufferNotEmpty.wait(&mutex);& & & & &mutex.unlock();&& & & & &fprintf(stderr, "%c", buffer[i % BufferSize]);&& & & & &mutex.lock();& & & & &--numUsedB& & & & &bufferNotFull.wakeAll();& & & & &mutex.unlock();& & &}& & &fprintf(stderr, "\n");&}&&int main(int argc, char *argv[])&{& & &QCoreApplication app(argc, argv);& & &P& & &C& & &producer.start();& & &consumer.start();& & &producer.wait();& & &consumer.wait();& & &return 0;&}
http://blog.csdn.net/emdfans/article/details/
Views(...) Comments()使用synchronized同步对象却有多个线程能同时访问,使用lock锁却达到目的了,不知道为什么求大神回答
[问题点数:40分,结帖人zz]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:23274
2013年1月 Java大版内专家分月排行榜第二
本版专家分:190
本版专家分:2200
本版专家分:565
本版专家分:13718
本版专家分:2200
本版专家分:2200
本版专家分:2200
本版专家分:8
本版专家分:0
本版专家分:0
本版专家分:2
本版专家分:2287
本版专家分:2287
本版专家分:2287
本版专家分:2287
本版专家分:2287
本版专家分:1917
本版专家分:45
本版专家分:169
本版专家分:55
本版专家分:499
匿名用户不能发表回复!
其他相关推荐请教Java 多线程高手一个简单的“线程对象是否共用线程类的成员变量”的问题。_百度知道
请教Java 多线程高手一个简单的“线程对象是否共用线程类的成员变量”的问题。
高手,小弟在这里做一下细节阐述:高手,小弟用线程类定义了一个线程对象,跑起来。小弟再次用线程类定义了第二个线程对象,跑起来。小弟希望高手点拨:如果小弟用第一个线程对象修改...
高手,小弟在这里做一下细节阐述:
高手,小弟用线程类定义了一个线程对象,跑起来。
小弟再次用线程类定义了第二个线程对象,跑起来。
小弟希望高手点拨:
如果小弟用第一个线程对象修改了线程类中的一个成员变量的值,当小弟再次拿第二个线程对象来面对前面的线程类中的成员变量时,小弟应该认为:这里的成员变量的值,是被第一个线程对象修改后的值?
还是这里的成员变量,是刚刚被初始化的成员变量?
希望得到高手的点拨!!
谢谢高手!!
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
来自电脑网络类芝麻团
采纳数:175
获赞数:225
参与团队:
&这要看你这两个线程使用是不是同一个对象,我写个例子,你仔细看一下public&class&Test&{
class&MyThreads&implements&Runnable{
private&int&flag&=&0;
public&MyThreads(){
public&void&run()&{
System.out.println(&flag&=&&&+&(++flag));
public&Test(){
System.out.println(&两条线程同用一个对象&);
MyThreads&myThread&=&new&MyThreads();
new&Thread(myThread).start();
new&Thread(myThread).start(); }
public&Test(int&i){
System.out.println(&两条线程使用不同对象&);
MyThreads&myThread&=&new&MyThreads();
new&Thread(myThread).start();
MyThreads&myThread2&=&new&MyThreads();
new&Thread(myThread2).start(); }
public&static&void&main(String[]&args)&{
Test&t&=&new&Test();
//线程输出太快,先暂停一会
Thread.currentThread().sleep(2000);
}&catch&(InterruptedException&e)&{
e.printStackTrace();
Test&t2&=&new&Test(1); }}
来自电脑网络类芝麻团
可以共用,但要加锁~~~~~~
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 线程任务对象实现的接口是 的文章

 

随机推荐