JAVA中多线程处理同一对象的问题 50
现在情况是这样的:我有几个类,分别是Table,Column和Cell,Table类有一个Column数组变量,Column类有一个Cell数组变量。之后我经过某些操作,...
现在情况是这样的:
我有几个类,分别是Table, Column和Cell,Table类有一个Column数组变量,Column类有一个Cell数组变量。之后我经过某些操作,新建了一个Table对象table。
接下来,我有还一个实现了Runnable接口的抽象类X;X还有一个抽象方法init,init需要一个Column类的对象作为参数。
最后,我写了一些算法类继承了抽象类X,这些类都有一个类型为Column的变量,并且重写了init和run方法;在init方法中,把方法的参数赋予类的成员变量;在run方法中,循环处理成员变量Column的所有Cell,
在运行过程中,主线程负责从Table对象table中拿到不同的Column对象,使用它们作为参数调用不同的算法类的init方法,然后再多线程跑这些算法类。
代码示例如下:
class Table{
Column[] columns;
}
class Column{
Cell[] cells;
}
class Cell<T>{
T value;
}
abstract class X implements Runnable{
abstract void init(Column column);
}
class X1 extends X{
Column column;
@Override
void init(Column column){
this.column = column;
}
@Override
void run(){
for(int i = 0; i < column.size(); i++){
Cell cell = column.get[i];
//做一些事情
cell.setValue("xxxx");
}
}
}
主线程中:
Table table = new Table();
//给table赋值,假设有10个column
for(int i = 0; i < 10; i ++){
Column column = table.getColumn(i);
X x1 = new X1();
x1.init(column);
new Thread(x1,"x1").start();
}
也就是说,假设一个table有10个column,就把这10个column交给10个算法对象去处理,这10个算法对象中可能来自同一个继承了X的类。
我的问题是:用这种结构多线程处理同一个Table对象中不同的column,会不会产生线程之间的冲突?现在的前提是column之间本身就是没有关联的,也就是说这里不存在线程同步的问题,每一个算法类只需要各司其职全力跑run方法就好了。但是目前我测试出来的结果是,多线程中的每一个线程都比单线程处理要慢。现在也不用考虑具体在run方法中做了什么,我只是简单的给每个cell重新设置了一个值而已。
举一个例子,单线程中,处理每一列都需要20毫秒,总共4列,共80毫秒;多线程中,处理每一列需要50毫秒,共50毫秒。
而后我又做了一个测试,在每个算法类的init方法中,不再使用传入的column给成员变量赋值,而是new一个Column对象,得到的结果是要快很多
我想知道为什么会如此影响效率?
补充一下,我的目的就是同时处理多个column,但是多个column的数据是一次性读出来的,而且我也不知道到底有多少个column;我所知道的就是每个column对应哪个算法类 展开
我有几个类,分别是Table, Column和Cell,Table类有一个Column数组变量,Column类有一个Cell数组变量。之后我经过某些操作,新建了一个Table对象table。
接下来,我有还一个实现了Runnable接口的抽象类X;X还有一个抽象方法init,init需要一个Column类的对象作为参数。
最后,我写了一些算法类继承了抽象类X,这些类都有一个类型为Column的变量,并且重写了init和run方法;在init方法中,把方法的参数赋予类的成员变量;在run方法中,循环处理成员变量Column的所有Cell,
在运行过程中,主线程负责从Table对象table中拿到不同的Column对象,使用它们作为参数调用不同的算法类的init方法,然后再多线程跑这些算法类。
代码示例如下:
class Table{
Column[] columns;
}
class Column{
Cell[] cells;
}
class Cell<T>{
T value;
}
abstract class X implements Runnable{
abstract void init(Column column);
}
class X1 extends X{
Column column;
@Override
void init(Column column){
this.column = column;
}
@Override
void run(){
for(int i = 0; i < column.size(); i++){
Cell cell = column.get[i];
//做一些事情
cell.setValue("xxxx");
}
}
}
主线程中:
Table table = new Table();
//给table赋值,假设有10个column
for(int i = 0; i < 10; i ++){
Column column = table.getColumn(i);
X x1 = new X1();
x1.init(column);
new Thread(x1,"x1").start();
}
也就是说,假设一个table有10个column,就把这10个column交给10个算法对象去处理,这10个算法对象中可能来自同一个继承了X的类。
我的问题是:用这种结构多线程处理同一个Table对象中不同的column,会不会产生线程之间的冲突?现在的前提是column之间本身就是没有关联的,也就是说这里不存在线程同步的问题,每一个算法类只需要各司其职全力跑run方法就好了。但是目前我测试出来的结果是,多线程中的每一个线程都比单线程处理要慢。现在也不用考虑具体在run方法中做了什么,我只是简单的给每个cell重新设置了一个值而已。
举一个例子,单线程中,处理每一列都需要20毫秒,总共4列,共80毫秒;多线程中,处理每一列需要50毫秒,共50毫秒。
而后我又做了一个测试,在每个算法类的init方法中,不再使用传入的column给成员变量赋值,而是new一个Column对象,得到的结果是要快很多
我想知道为什么会如此影响效率?
补充一下,我的目的就是同时处理多个column,但是多个column的数据是一次性读出来的,而且我也不知道到底有多少个column;我所知道的就是每个column对应哪个算法类 展开
2015-02-03
展开全部
确定是同一个对象?
使用
public void method() {
synchronized (column){
//…..
}
}
使用
public void method() {
synchronized (column){
//…..
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询