Redian新闻
>
Java的多线程的一般问题
avatar
Java的多线程的一般问题# Programming - 葵花宝典
b*i
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)外,还有什么别的办法?
我问这个主要因为这个程序的调用已经有几百个函数这么写了。要改还有点麻烦,也不
确定我就能全部搞定。怎么简单点可以把线程的基本信息告诉非常深入的子程序呢?
avatar
h*c
2
好像不是这么用的, thread id 是runtime information, 好像记得是Thread.
getCurrentThreadId()
比较直观是jprofiler,用jvisualvm夜行;
threadId 是 mutatable, 所以可以set, 你可以看到 thread-pool-01-id-001之类
avatar
c*e
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();

avatar
T*e
4
如果dc.dosomething()的呼叫线程是MyThread或者它的子类,直接吧当前线程cast成
MyThread就能拿到id了吧。
avatar
c*e
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之类

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

【在 c*********e 的大作中提到】
: lz说的id,到底是指thread的id,还是myThread中的id这个属性?
avatar
l*a
7
声明成final,就可以直接用了
avatar
b*i
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之类

avatar
p*o
9
ThreadLocal

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

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

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

avatar
c*e
11
跟你说,multi-threading比async慢很多。还不如用async

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

avatar
b*i
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
avatar
c*e
13
你这么写,怎么保证synchronized呢?怎么保证没有conflict? atomic怎么保证?可见
性?

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

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

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。