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 | |
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怎么保证?可见 : 性?
|