100分!请教一个由线程产生文件的问题!!多谢了!!! 在每个线程里加个sleep(1)试试,以前我做多线程取随机数,经常取到相同的。加上这个就OK 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to:treeroot(根根)不好意思,同步方法怎么被共享啊? to:denghan(很久没来ASP版了) 我已经加了Thread.sleep(5)了,还是没有用啊! class MyObject{ public synchronized Hashtable analyse(String str){}}class MyThread extends Thread{ private MyObject obj=new MyObject(); public void run(){ //这里访问的是这个线程私有的MyObject对象,各个线程之间没有关系 }}这样上面的方法同步当然是没有用的,通过三种情况修改1.public synchronized Hashtable analyse(String str){} 前加上static,这个方法对类同步2.private MyObject obj=new MyObject(); 前面加static,线程共享一个实例3.另外一种情况就是class MyThread extends Thread{ private MyObject obj; public MyThread(MyObject obj){this.obj=obj;} public void run(){ //这里访问的是这个线程私有的MyObject对象,各个线程之间没有关系 }}然后也可以共享一个实例MyObject o=new MyObject();Thread t1=new MyThread(o);Thread t2=new MyThread(o);.....t1.start();t2.start();... to: treeroot(根根) 你好!我是实现的runnable方法做线程的。试了你的方法,在analyse方法前加了static还是没用避免重名的现象! to: febchen() 随机数我怕重复啊!如果线程多了。几千个并发,难免会重名吧? 程序运行checkmessage.java等待队列里面的消息:public class CheckMessage{ public static void main(String[] args) { try { while (true) { //此处省略了一段代码,程序设置了一个队列等待消息,如果有消息进入队列则新建一个线程去处理 if (queue.getCurrentDepth()!=0) { new Thread(new Responder()).start(); Thread.sleep(100); } else { Thread.sleep(100); } } } catch(Exception e) { e.printStackTrace(); } }}如果有消息了,就调用responder.java处理。public class Responder implements Runnable{ public void run() { try { //解析字符串 AnalyzeXML analyzeXml = new AnalyzeXML(); Hashtable msgHash = analyzeXml.analyse(msgString); String orderStr = msgHash.get("commandtype").toString(); catch(Exception e) { e.printStackTrace(); } }}然后调用AnalyzeXML.java来保存文件。更奇怪的是我用了随机数还是会有同名文件!public class AnalyzeXML { public synchronized Hashtable analyse(String str) { try { ResourceBundle rb = ResourceBundle.getBundle("Source"); String tempXmlFile = rb.getString("TempXmlFile").trim(); //Thread.sleep(5); //Date today = new Date(); //Thread.sleep(5); Random r = new Random(); int i = r.nextInt(1000000000); SimpleDateFormat df = new SimpleDateFormat("yy.MM.dd_HH.mm.ss.SSS"); String newpath = tempXmlFile.substring(0,tempXmlFile.length()-4) + df.format(new Date()) + String.valueOf(i)+".xml"; System.out.println("~~~~~~~~"+newpath); } catch(Exception e) { System.out.println(e); } return ht; }} to: treeroot(根根)啊?那该怎么解决呢?????????? 同步问题,上面已经说过,对于随机数不要每次都重新生成种子,可以这样private static Random r=new Random();..........{ int i=r.nextInt();} 得到线程的HashCode,这样就不会相同了。 to: treeroot(根根)我把public synchronized Hashtable analyse(String str)方法加上static还是没有用。比如100个线程并发总会出现99个不同文件。有两个文件会重名。 this.sleep(1)和Thread.sleep(1)的含义不一样! 补充一下: 或加上线程的hashcode. 没仔细看程序,总觉得这样不是办法,应为你是要区分上千个文件总要一个区分因子,这和线程是否同步没什么关系(同步可能用在其他方面),当然随机数也会重的。如果考虑在生成线程的时候给他一个数如何?比如long i,i是递增的,i的上限比如说是10000,到了10000再从0开始,然后和日期结合,这样保证在同一毫秒内最多有10000个不相同的i的文件,不同时间i相同是没有关系的。如果10000不够可以再加。import java.util.*;import java.text.*;import java.math.*;public class Filenames extends Thread{ public int i; public Filenames(int i){ this.i=i; } public void run(){ analyse("test",i); } public void analyse(String str,int i) { try { //ResourceBundle rb = ResourceBundle.getBundle("Source"); String tempXmlFile ="textFile";// rb.getString("TempXmlFile").trim(); //Thread.sleep(5); Date today = new Date(); //Thread.sleep(1000); SimpleDateFormat df = new SimpleDateFormat("yy.MM.dd_HH.mm.ss.SSS"); String newpath = tempXmlFile.substring(0,tempXmlFile.length()-4) + df.format(today)+i +".xml"; System.out.println("~~~~~~~~"+newpath); }catch(Exception e){ e.printStackTrace(); } } public static void main(String a[]){ int i; Filenames[] getFn=new Filenames[100]; for(i=0;i<100;i++){ getFn[i]=new Filenames(i); getFn[i].start(); } } } 谢谢各位的帮助!尤其是 treeroot(根根)和 febchen() 两位DX!多谢多谢!分已经全部送上! Hashtable 多线程遍历删除的奇怪问题!! 排序问题 action forward 打开新窗口 谁教我内部类匿名的使用,从基础开始.又需要我等下在开个空问题付给100分给你.... 我怎么觉得抽象类和接口是一回事,是吗? 菜鸟想问关于命令行参数的问题 如何继承多个类 如何动态定义对象、变量或调用方法?请指教。 jpanel问题? JAVA十六进制问题 急!!!!java进行串口通讯问题,“CommPortIdentifier.getPortIdentifiers()取得端口链表为空”的问题 请教各位老师一个关于“\r”在文本中留下乱码的问题?
不好意思,同步方法怎么被共享啊?
我已经加了Thread.sleep(5)了,还是没有用啊!
public synchronized Hashtable analyse(String str){}
}class MyThread extends Thread{
private MyObject obj=new MyObject();
public void run(){
//这里访问的是这个线程私有的MyObject对象,各个线程之间没有关系
}
}
这样上面的方法同步当然是没有用的,通过三种情况修改
1.public synchronized Hashtable analyse(String str){}
前加上static,这个方法对类同步
2.private MyObject obj=new MyObject();
前面加static,线程共享一个实例
3.另外一种情况就是
class MyThread extends Thread{
private MyObject obj;
public MyThread(MyObject obj){this.obj=obj;}
public void run(){
//这里访问的是这个线程私有的MyObject对象,各个线程之间没有关系
}
}
然后也可以共享一个实例
MyObject o=new MyObject();
Thread t1=new MyThread(o);
Thread t2=new MyThread(o);
.....
t1.start();t2.start();...
你好!我是实现的runnable方法做线程的。试了你的方法,在analyse方法前加了static还是没用避免重名的现象!
随机数我怕重复啊!如果线程多了。几千个并发,难免会重名吧?
public class CheckMessage
{
public static void main(String[] args)
{
try
{
while (true)
{
//此处省略了一段代码,程序设置了一个队列等待消息,如果有消息进入队列则新建一个线程去处理
if (queue.getCurrentDepth()!=0)
{
new Thread(new Responder()).start();
Thread.sleep(100);
}
else
{
Thread.sleep(100);
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}如果有消息了,就调用responder.java处理。
public class Responder implements Runnable
{
public void run()
{
try
{
//解析字符串
AnalyzeXML analyzeXml = new AnalyzeXML();
Hashtable msgHash = analyzeXml.analyse(msgString);
String orderStr = msgHash.get("commandtype").toString();
catch(Exception e)
{
e.printStackTrace();
}
}}
然后调用AnalyzeXML.java来保存文件。更奇怪的是我用了随机数还是会有同名文件!public class AnalyzeXML
{
public synchronized Hashtable analyse(String str)
{
try
{
ResourceBundle rb = ResourceBundle.getBundle("Source");
String tempXmlFile = rb.getString("TempXmlFile").trim();
//Thread.sleep(5);
//Date today = new Date();
//Thread.sleep(5);
Random r = new Random();
int i = r.nextInt(1000000000);
SimpleDateFormat df = new SimpleDateFormat("yy.MM.dd_HH.mm.ss.SSS");
String newpath = tempXmlFile.substring(0,tempXmlFile.length()-4) + df.format(new Date()) + String.valueOf(i)+".xml";
System.out.println("~~~~~~~~"+newpath);
}
catch(Exception e)
{
System.out.println(e);
}
return ht;
}}
啊?那该怎么解决呢??????????
private static Random r=new Random();
..........{
int i=r.nextInt();
}
我把public synchronized Hashtable analyse(String str)方法加上static还是没有用。比如100个线程并发总会出现99个不同文件。有两个文件会重名。
总要一个区分因子,这和线程是否同步没什么关系(同步可能用在其他方面),当然随机数也会重的。如果考虑在生成线程的时候给他一个数如何?
比如long i,i是递增的,i的上限比如说是10000,到了10000再从0开始,然后和日期结合,这样保证在同一毫秒内最多有10000个不相同的i的文件,不同时间i相同是没有关系的。
如果10000不够可以再加。import java.util.*;
import java.text.*;
import java.math.*;public class Filenames extends Thread{
public int i;
public Filenames(int i){
this.i=i;
}
public void run(){
analyse("test",i);
} public void analyse(String str,int i)
{
try
{
//ResourceBundle rb = ResourceBundle.getBundle("Source");
String tempXmlFile ="textFile";// rb.getString("TempXmlFile").trim();
//Thread.sleep(5);
Date today = new Date();
//Thread.sleep(1000);
SimpleDateFormat df = new SimpleDateFormat("yy.MM.dd_HH.mm.ss.SSS");
String newpath = tempXmlFile.substring(0,tempXmlFile.length()-4) + df.format(today)+i +".xml";
System.out.println("~~~~~~~~"+newpath);
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String a[]){
int i;
Filenames[] getFn=new Filenames[100];
for(i=0;i<100;i++){
getFn[i]=new Filenames(i);
getFn[i].start();
}
}
}