在自己的线程中执行类

时间:2015-07-09 10:54:16

标签: java multithreading

我有一个InstanceFactory类,它创建某个类的实例,让我们称之为instance类。这些实例是使用main()方法创建的。在此实例课程中,我目前拨打instance.init()instance.put()instance.stop()等电话。

由于一切都在一个线程中运行,并且我发现了一些性能问题,我想尝试在一个单独的线程中运行实例。

我必须对实例类进行哪些更改才能让它在单独的线程中运行?我是否仍然能够拨打相同的电话,例如instance.init()

更新(已添加代码):

InstanceFactory instanceFactory = new InstanceFactory();
try (Instance instance = instanceFactory.create()) {
    instance.init();
    instance.doStuff();
    while ((input = reader.readNext()) != null) {
        instance.put(input);
    }
}

实例应该在自己的线程中运行。

2 个答案:

答案 0 :(得分:2)

Executors.newSingleThreadExecutor()只创建一个工作线程,因此您将拥有一个主线程+ 一个工作线程,其中 post()任务的FIFO队列。如果您的post()方法线程安全,则应使用Executors.newCachedThreadPool()根据需要创建如此多的线程。

InstanceFactory instanceFactory = new InstanceFactory();
ExecutorService executor = Executors.newCachedThreadPool();
try (Instance instance = instanceFactory.create()) {
    instance.init();
    instance.doStuff();
    while ((input = reader.readNext()) != null) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                instance.put(input);
            }
        });
    }
} finally {
    executor.shutdown();
}

我建议您阅读关于 ExecutorService official documentation和一些guides

答案 1 :(得分:1)

您可以使用ExecutorService

如果class MY_controller extends CI_controller{ function __construct() { parent::__construct(); } function _required_user($params =array()){ $action =$this->router->fetch_method(); if(empty($params['except'])) $params['except'] =array(); if(empty($params['only'])) $params['only'] =array(); if(count($params['except']) > 0 && in_array($action,$params['except'])) return true; if(count($params['only']) > 0 && in_array($action,$params['only']) && $this->session->userdata('is_login')) return true; if($this->session->userdata('is_login')) return true; redirect('login'); } } class dashboard extends MY_Controller { function __construct() { parent::__construct(); $this->load->library('session'); $this->load->model('dbmodel'); $this->load->helper('url','form'); $this->_required_user(array('except'=>array('index'))) } function add(){ /* Session required */ } function edit(){ /* Session required */ } function index(){ /* no session required */ } } class content extends MY_Controller{ function __construct() { parent::__construct(); $this->load->library('session'); $this->load->model('dbmodel'); $this->load->helper('url','form'); $this->_required_user(array('only'=>array('index'))) } function add(){ /* no Session required */ } function edit(){ /* no Session required */ } function index(){ /* session required */ } } class Myaccount extends MY_Controller{ function __construct() { parent::__construct(); /* for all functions session required */ $this->_required_user() } function edit(){ /* session required */ } function save(){ /* session required */ } } 是线程安全的,则可以将instance.put()替换为Executors.newSingleThreadExecutor();

Executors.newCachedThreadPool()

注意:这是未经测试的代码。