标题: 关于new Random().nextInt();的问题 [打印本页] 作者: 李文富 时间: 2012-5-31 13:54 标题: 关于new Random().nextInt();的问题 import java.util.Random;
public class ThreadScopeShareData {
/**
* @param args
*/
private static int data = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i =0 ;i<2;i++){
new Thread(new Runnable(){
@Override
public void run() {
data = new Random().nextInt();
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"put data"+data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get() {
// TODO Auto-generated method stub
System.out.println("A "+Thread.currentThread().getName()+" data "+data);
}
}
static class B{
public void get() {
// TODO Auto-generated method stub
System.out.println("B "+Thread.currentThread().getName()+"data "+data);
}
}
}
运行如下:
Thread-0 put data-1216341610
Thread-1 put data-1216341610
A Thread-0 data -1216341610
A Thread-1 data -1216341610
B Thread-0 data -1216341610
B Thread-1 data -1216341610
请问为什么thread -0 ,thread-1中 new Random().nextInt()的值是一样的,并没有随机产生; 作者: 黑马—陈磊 时间: 2012-5-31 14:25
可能是因为几个个线程启动的时间相差无几,而不同线程调用new Random().nextInt();
函数时相对是独立的,因而产生的随机数序列也就是相同的。作者: 刘伯阳 时间: 2012-5-31 14:37
因为你定义的Data是静态(static)的,静态的变量只共享一个副本,所以当它一初始化后,值会在整个类中共享。
我不知道你要的是不是这个意思,简单在你的代码上改动了一下:
import java.util.Random;
public class ThreadScopeShareData implements Runnable {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i =0 ;i<2;i++){
ThreadScopeShareData r = new ThreadScopeShareData();
new Thread(r).start();
}
}
@Override
public void run() {
int data = 0;
data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()+"put data"+data);
System.out.println("A "+Thread.currentThread().getName()+" data "+data);
System.out.println("B "+Thread.currentThread().getName()+" data "+data);
因为你的data是静态(static)的,所以它会共享一个副本,当第一个随机数生成之后,被整个类共享,所以它的值不会改变。
我不知道你要实现什么功能,在你的代码的基础上改了一下:
import java.util.Random;
public class ThreadScopeShareData implements Runnable {
public static void main(String[] args) {
for(int i =0 ;i<2;i++){
ThreadScopeShareData r = new ThreadScopeShareData();
new Thread(r).start();
}
}
@Override
public void run() {
int data = 0;
data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()+"put data"+data);
System.out.println("A "+Thread.currentThread().getName()+" data "+data);
System.out.println("B "+Thread.currentThread().getName()+" data "+data);
public class ThreadLocalTest {
/**
* @param args
*/
private static ThreadLocal<Integer> x= new ThreadLocal<Integer>();
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i =0 ;i<2;i++){
new Thread(new Runnable(){
@Override
public void run() {
int data = new Random().nextInt();
x.set(data);
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"put data"+data);
MyThreadData.getThreadInstance().setName("name"+data);
MyThreadData.getThreadInstance().setAge(data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get() {
// TODO Auto-generated method stub
int data =x.get();
System.out.println("A "+Thread.currentThread().getName()+"data "+data);
MyThreadData myData = MyThreadData.getThreadInstance();
System.out.println("A "+Thread.currentThread().getName()+"getmydata "+myData.getName()+
" "+myData.getAge());
}
}
static class B{
public void get() {
// TODO Auto-generated method stub
int data =x.get();
System.out.println("B"+Thread.currentThread().getName()+"data "+data);
MyThreadData myData = MyThreadData.getThreadInstance();
System.out.println("B "+Thread.currentThread().getName()+"getmydata "+myData.getName()+
" "+myData.getAge());
}
}
}
class MyThreadData{
private MyThreadData(){}
public static synchronized MyThreadData getThreadInstance(){
MyThreadData instance = map.get();
if (instance == null){
instance = new MyThreadData();
map.set(instance);
}
return instance;
}
//private static MyThreadData instance =null;
private static ThreadLocal<MyThreadData> map = new ThreadLocal<MyThreadData>();
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age
}
}
现在的问题是像提问中遇到的,是线程切换太快而导致使用到random数据时一样的?作者: 李文富 时间: 2012-5-31 15:03
黑马11期李项京 发表于 2012-5-31 14:59
new Random().nextInt()需要填入参数:比如new Random().nextInt(10)参数0-9的随机数