我有一个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);
}
}
实例应该在自己的线程中运行。
答案 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()
注意:这是未经测试的代码。