普通用法而言,stdthread更加方便,因为它可以轻松创建和管理多线程。它利用C++11中提供的thread类来管理线程,并允许多线程之间在一个程序中共享变量。但是,如果要求更高的安全性和性能,则应使用unique_ptr。
Unique_ptr是一种智能指针,它具有比std thread更强大的功能,因为它可以在一个程序中管理多个线程,而且可以让指针只能由一个线程访问。此外,unique_ptr还可以帮助防止内存泄漏,因为它可以跟踪内存的分配和释放。
因此,在使用多线程时,应该根据需求选择是使用std thread还是使用unique_ptr。如果只是创建和管理简单的多线程,则std thread可以满足要求,但是如果要求更高的安全性和性能,则应该使用unique_ptr。
可以让线程实现Callable接口,实现call方法,可以把你需要的东西return回去,然后如果是线程池的话可以用Future对象的get()方法来接收这个返回值。但是这样做线程池也只会同步执行一个线程。
全局变量和你传进线程的变量,类似。都是需要用线程锁来进行同步访问的。
全局变量用到线程里,以前是为了方便,不需要每次将变量传进函数里。因为CreateThread太麻烦,只能传进一个指针。现在用Boost就比较方便,可以传进多个参数。
Java线程池需要不断的学习 在学习的时候我们就要注意不少的问题 下面我们就来看看具体的语言运作环境如何才能满足Java线程池相关程序的运行 希望大家有所收获
无论是接收Runnable型参数 还是接收Callable型参数的submit()方法 都会返回一个Future(也是一个接口)类型的对象 该对象中包含了任务的执行情况以及结果 调用Future的boolean isDone()方法可以获知任务是否执行完毕 调用Object get()方法可以获得任务执行后的返回结果 如果此时任务还没有执行完 get()方法会保持等待 直到相应的任务执行完毕后 才会将结果返回
我们用下面的一个例子来演示Java 中Java线程池的使用
Java代码
import ncurrent ;
public class ExecutorTest {
public static void main(String[] args) throws
InterruptedException
ExecutionException {
ExecutorService es = Executors newSingleThreadExecutor();
Future fr = es submit(new RunnableTest());// 提交任务
Future fc = es submit(new CallableTest());// 提交任务
// 取得返回值并输出
System out println((String) fc get());
// 检查任务是否执行完毕
if (fr isDone()) {
System out println( 执行完毕 RunnableTest run() );
} else {
System out println( 未执行完 RunnableTest run() );
}
// 检查任务是否执行完毕
if (fc isDone()) {
System out println( 执行完毕 CallableTest run() );
} else {
System out println( 未执行完 CallableTest run() );
}
// 停止线程池服务
es shutdown();
}
}
class RunnableTest implements Runnable {
public void run() {
System out println( 已经执行 RunnableTest run() );
}
}
class CallableTest implements Callable {
public Object call() {
System out println( 已经执行 CallableTest call() );
return 返回值 CallableTest call() ;
}
}
import ncurrent ;
public class ExecutorTest {
public static void main(String[] args) throws
InterruptedException
ExecutionException {
ExecutorService es = Executors newSingleThreadExecutor();
Future fr = es submit(new RunnableTest());// 提交任务
Future fc = es submit(new CallableTest());// 提交任务
// 取得返回值并输出
System out println((String) fc get());
// 检查任务是否执行完毕
if (fr isDone()) {
System out println( 执行完毕 RunnableTest run() );
} else {
System out println( 未执行完 RunnableTest run() );
}
// 检查任务是否执行完毕
if (fc isDone()) {
System out println( 执行完毕 CallableTest run() );
} else {
System out println( 未执行完 CallableTest run() );
}
// 停止线程池服务
es shutdown();
}
}
class RunnableTest implements Runnable {
public void run() {
System out println( 已经执行 RunnableTest run() );
}
}
class CallableTest implements Callable {
public Object call() {
System out println( 已经执行 CallableTest call() );
return 返回值 CallableTest call() ;
}
}
运行结果
已经执行 RunnableTest run()
已经执行 CallableTest call()
返回值 CallableTest call()
执行完毕 RunnableTest run()
执行完毕 CallableTest run()
lishixinzhi/Article/program/Java/gj/201311/27283
java中线程池的监控可以检测到正在执行的线程数。
通过线程池提供的参数进行监控。线程池里有一些属性在监控线程池的时候可以使用
taskCount:线程池需要执行的任务数量。
completedTaskCount:线程池在运行过程中已完成的任务数量。小于或等于taskCount。
largestPoolSize:线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过。如等于线程池的最大大小,则表示线程池曾经满了。
getPoolSize:线程池的线程数量。如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不+ getActiveCount:获取活动的线程数。
通过扩展线程池进行监控。通过继承线程池并重写线程池的beforeExecute,afterExecute和terminated方法,我们可以在任务执行前,执行后和线程池关闭前干一些事情。如监控任务的平均执行时间,最大执行时间和最小执行时间等。这几个方法在线程池里是空方法。如:
protected void beforeExecute(Thread t, Runnable r) { }
可以通过实现Callable接口创建一个有返回值的线程,代码如下:
import javautilconcurrent;public class MyThread implements Callable<Integer> {
private int count;
public MyThread(int count) {
thiscount = count;
}
@Override
public Integer call() throws Exception {
// 此处是线程要处理的业务代码,此处实现的是对count变量加1的 *** 作
count += 1;
Threadsleep(1000);
return count;
}
public static void main(String[] args) {
// 创建线程实例
MyThread myThread = new MyThread(1);
// 创建一个大小为10的线程池
ExecutorService executor = ExecutorsnewFixedThreadPool(10);
// 将线程提交到线程池执行
Future<Integer> future = executorsubmit(myThread);
try {
// 调用get方法获取线程执行结果,在线程执行完成前该方法会一直阻塞
Integer result = futureget();
Systemoutprintln(result);
} catch (InterruptedException e) {
eprintStackTrace();
} catch (ExecutionException e) {
eprintStackTrace();
}
// try {
// // 这种写法可以设置线程执行的超时时间,当线程超过指定的时间还未执行完成时会抛出TimeoutException异常
// // 示例中表示线程超过1000毫秒还没执行完就会抛出超时异常
// Integer result = futureget(1000, TimeUnitMILLISECONDS);
// Systemoutprintln(result);
// } catch (InterruptedException e) {
// eprintStackTrace();
// } catch (ExecutionException e) {
// eprintStackTrace();
// } catch (TimeoutException e) {
// eprintStackTrace();
// }
}
}
以上就是关于直接用stdthread还是用unique_ptr全部的内容,包括:直接用stdthread还是用unique_ptr、java 线程中的run()方法无返回值并且不停止,如何得到线程数据、VC++ 使用boost线程 主线程获取子线程结果 详细如下等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)