直接用stdthread还是用unique_ptr

直接用stdthread还是用unique_ptr,第1张

普通用法而言,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线程 主线程获取子线程结果 详细如下等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10149420.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存