由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - Java的多线程的一般问题
相关主题
重新学习Java Thread的Field变量与Thread Local重复利用threads的问题
请教一个Java编程问题关于多线程编程的一个问题
关于Java一个小程序的结果多线程有什么优化的方法?
编程题又一道问个C++编译器如何处理函数内的static 变量
Java 多线程 的架构如何改进?关于线程读写全局变量的问题
Java 多线程:还需要好CPU?请问多个线程同时访问同一个内存地址会不会使得程序变慢
问题一枚引用的几个基本问题,有点糊涂
请问python能否在一个子程序里边创立独立的命名空间?A C++ inheritance question!
相关话题的讨论汇总
话题: 线程话题: mythread话题: public话题: runnable话题: thread
进入Programming版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
主要是Java,也可以应用在其他语言:
我自己定义一个线程的类,然后定义一些实例,这些实例有些基本的变量的值是不同的
,比如
public class MyThread extends Runnable{
int id;
public void setID(int idd){id=idd;}
public void setFunction(DifferentClass dc);
...
public void run(){
dc.dosomething();
}
}
然后我想在dc.dosomething这个函数里面取得呼叫它的线程的信息:id,除了在run里
面吧这个传入dc.dosomething(id)外,还有什么别的办法?
我问这个主要因为这个程序的调用已经有几百个函数这么写了。要改还有点麻烦,也不
确定我就能全部搞定。怎么简单点可以把线程的基本信息告诉非常深入的子程序呢?
h**********c
发帖数: 4120
2
好像不是这么用的, thread id 是runtime information, 好像记得是Thread.
getCurrentThreadId()
比较直观是jprofiler,用jvisualvm夜行;
threadId 是 mutatable, 所以可以set, 你可以看到 thread-pool-01-id-001之类
c*********e
发帖数: 16335
3
final public class MyThread extends Runnable{
private final int id;
public MyThread (int idd, DifferentClass dc) {
this.id= idd;
//setFunction's business logic here:
}
@override
public void run(){
dc.dosomething();
}
}

【在 b***i 的大作中提到】
: 主要是Java,也可以应用在其他语言:
: 我自己定义一个线程的类,然后定义一些实例,这些实例有些基本的变量的值是不同的
: ,比如
: public class MyThread extends Runnable{
: int id;
: public void setID(int idd){id=idd;}
: public void setFunction(DifferentClass dc);
: ...
: public void run(){
: dc.dosomething();

T*****e
发帖数: 361
4
如果dc.dosomething()的呼叫线程是MyThread或者它的子类,直接吧当前线程cast成
MyThread就能拿到id了吧。
c*********e
发帖数: 16335
5
lz说的id,到底是指thread的id,还是myThread中的id这个属性?

【在 h**********c 的大作中提到】
: 好像不是这么用的, thread id 是runtime information, 好像记得是Thread.
: getCurrentThreadId()
: 比较直观是jprofiler,用jvisualvm夜行;
: threadId 是 mutatable, 所以可以set, 你可以看到 thread-pool-01-id-001之类

T*****e
发帖数: 361
6
看上去是MyThread中定义的id啊,他都可以支持传进来的。不直接传可能是避免参数变
动导致的修改吧。
如果只是一般意义上的线程id,那跟MyThread的实现一毛钱关系都没有。

【在 c*********e 的大作中提到】
: lz说的id,到底是指thread的id,还是myThread中的id这个属性?
l***a
发帖数: 2
7
声明成final,就可以直接用了
b***i
发帖数: 3043
8
谢谢,看了大家的回复,看来有希望。
我要做的是这么一件事情。我拿到一个项目的源代码,整个项目实现有好几十个类,其
中具体操作的实现里面有几百个函数,其中大约10几个是有关访问网页的,其他的是计
算。中间嵌套调用很多。举个例子,比如,读网页,分析网页,这些都是有一个共用的
变量来记录现在的状态的。这个项目只能读写一个网页。
我想把多线程加进去,比如一个线程读一个网页,另一个可以读另一个。但是,我现在
有一个static的控制变量,如果一个线程改了该网页的状态,如成功与否,是否再试一
次,网页内容多少,另一个就发现也改了。
怎么做呢?我想的就是生成多个控制变量数组,或者每个线程动态生成这个控制变量,
把这个变量
传入相关的每一个函数。有180多个。
另一个办法,是不用改180个函数的定义,而是在每个具体相关的函数(大约10个)需
要首先获得当前线程的id,然后在控制变量的数组里面取出这个线程对应的那个控制变
量。这个只要保证线程id不超过100个,我数组先定义个1000这么大。
本质上,是每个线程运行的时候,从线程堆栈里找出线程的唯一的标志信息,然后取得
和该线程对应的控制变量。这个变量是在线程生成的时候确定的,然后放入数组里面。
而取这个变量则是在线程间接呼叫了很多其他类的函数,最后到了网页函数那里,才从
线程的id和全局数据取得这个控制变量。
最好是我能够改变Java生成的线程的id。不行,用Java自己的id也可以,只是我不会有
许多线程,数组定义大一点就好了。
class MyThread implements Runnable{
public static Control[] myControls = new Control[1000];
...
public void run(){
myControls[Thread.getCurrentID()]=new Control();
dc.dosomething();
}
};
// time to create thread
MyThread a = new MyThread();
a.start();
class DC {
Other o;
public void dosomsething(){
o.dootherthing();
}
}
class O {
public dootherthing(){
Control myControl=MyThread.myControls[Thread.getCurrentID()];
//用myControl来记录结果
}
}

【在 h**********c 的大作中提到】
: 好像不是这么用的, thread id 是runtime information, 好像记得是Thread.
: getCurrentThreadId()
: 比较直观是jprofiler,用jvisualvm夜行;
: threadId 是 mutatable, 所以可以set, 你可以看到 thread-pool-01-id-001之类

p***o
发帖数: 1252
9
ThreadLocal

【在 b***i 的大作中提到】
: 谢谢,看了大家的回复,看来有希望。
: 我要做的是这么一件事情。我拿到一个项目的源代码,整个项目实现有好几十个类,其
: 中具体操作的实现里面有几百个函数,其中大约10几个是有关访问网页的,其他的是计
: 算。中间嵌套调用很多。举个例子,比如,读网页,分析网页,这些都是有一个共用的
: 变量来记录现在的状态的。这个项目只能读写一个网页。
: 我想把多线程加进去,比如一个线程读一个网页,另一个可以读另一个。但是,我现在
: 有一个static的控制变量,如果一个线程改了该网页的状态,如成功与否,是否再试一
: 次,网页内容多少,另一个就发现也改了。
: 怎么做呢?我想的就是生成多个控制变量数组,或者每个线程动态生成这个控制变量,
: 把这个变量

w**z
发帖数: 8232
10
能说简洁一点吗?
看上去,你这多线程设计不太对,要根据线程id 进行操作?smells like disaster to
me.

【在 b***i 的大作中提到】
: 谢谢,看了大家的回复,看来有希望。
: 我要做的是这么一件事情。我拿到一个项目的源代码,整个项目实现有好几十个类,其
: 中具体操作的实现里面有几百个函数,其中大约10几个是有关访问网页的,其他的是计
: 算。中间嵌套调用很多。举个例子,比如,读网页,分析网页,这些都是有一个共用的
: 变量来记录现在的状态的。这个项目只能读写一个网页。
: 我想把多线程加进去,比如一个线程读一个网页,另一个可以读另一个。但是,我现在
: 有一个static的控制变量,如果一个线程改了该网页的状态,如成功与否,是否再试一
: 次,网页内容多少,另一个就发现也改了。
: 怎么做呢?我想的就是生成多个控制变量数组,或者每个线程动态生成这个控制变量,
: 把这个变量

c*********e
发帖数: 16335
11
跟你说,multi-threading比async慢很多。还不如用async

【在 b***i 的大作中提到】
: 谢谢,看了大家的回复,看来有希望。
: 我要做的是这么一件事情。我拿到一个项目的源代码,整个项目实现有好几十个类,其
: 中具体操作的实现里面有几百个函数,其中大约10几个是有关访问网页的,其他的是计
: 算。中间嵌套调用很多。举个例子,比如,读网页,分析网页,这些都是有一个共用的
: 变量来记录现在的状态的。这个项目只能读写一个网页。
: 我想把多线程加进去,比如一个线程读一个网页,另一个可以读另一个。但是,我现在
: 有一个static的控制变量,如果一个线程改了该网页的状态,如成功与否,是否再试一
: 次,网页内容多少,另一个就发现也改了。
: 怎么做呢?我想的就是生成多个控制变量数组,或者每个线程动态生成这个控制变量,
: 把这个变量

b***i
发帖数: 3043
12
看了一下,似乎这个就是我最终想要的。
就是说,在我自己实现了Runnable的类里面定义一个static变量
class MyThread implements Runnable{
ThreadLocal myControl...
public void run(){
call other class, other functions
}
...
}
class Other {
public void dosomething(){// without passing in any parameter
MyThread.myControl...就可以访问该线程所拥有的那个Control,而不是所有线程
共有一个。
虽然在语法上是static变量,但是其实是线程相关的。当然,也可能需要通过函数访
问,不是直接访问这个变量。
}

【在 p***o 的大作中提到】
: ThreadLocal
c*********e
发帖数: 16335
13
你这么写,怎么保证synchronized呢?怎么保证没有conflict? atomic怎么保证?可见
性?

【在 b***i 的大作中提到】
: 看了一下,似乎这个就是我最终想要的。
: 就是说,在我自己实现了Runnable的类里面定义一个static变量
: class MyThread implements Runnable{
: ThreadLocal myControl...
: public void run(){
: call other class, other functions
: }
: ...
: }
: class Other {

b***i
发帖数: 3043
14
今天才发现原来Runnable里面的变量居然是共享的。下面居然显示两个1
public class ThreadTester implements Runnable {
private int firstID;
public ThreadTester(int t){firstID=t;}
public void run(){
System.out.println("my id = "+firstID;
}
public static void main(String[] args){
ThreadTester a = new ThreadTester(1);
ThreadTester b = new ThreadTester(2);
Thread n1= new Thread(a);
Thread n2 = new Thread(b);
n1.start();
n2.start();
n1.join();
n2.join();
.. throw, catch, try whatever
}
}
但是使用ThreadLocal就好了

【在 c*********e 的大作中提到】
: 你这么写,怎么保证synchronized呢?怎么保证没有conflict? atomic怎么保证?可见
: 性?

1 (共1页)
进入Programming版参与讨论
相关主题
A C++ inheritance question!Java 多线程 的架构如何改进?
问个C语言里面全局变量和本地变量引用问题Java 多线程:还需要好CPU?
求教一个Java问题 IllegalMonitorStateException问题一枚
问一个JAVA Interface Design的问题请问python能否在一个子程序里边创立独立的命名空间?
重新学习Java Thread的Field变量与Thread Local重复利用threads的问题
请教一个Java编程问题关于多线程编程的一个问题
关于Java一个小程序的结果多线程有什么优化的方法?
编程题又一道问个C++编译器如何处理函数内的static 变量
相关话题的讨论汇总
话题: 线程话题: mythread话题: public话题: runnable话题: thread