多线程间数据共享,再次提问题。 依然是没有人回答吗?即使不会也可以关注一下嘛。国内好像用java的确实不多。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 string saveResult=new string(); for(int i=0;i<30;i++){ try{ InetAddress address=InetAddress.getByName(arg[0]); mythread st=new mythread(address,i,saveResult);//将此传递给线程 st.start(); }catch(IOException e){ System.out.println("异常"); } }//****************************************************/// 类名: mythread// 功能: 继承Thread,用于传递参数,得到返回值// 参数: int i 端口//****************************************************/class mythread extends Thread{ private int port; private InetAddress myaddress; //public String strResult=new String(); public mythread(InetAddress address,int i,string strResult){ myaddress=address; port=i; } public void run(){ try{ Socket socket = new Socket(myaddress,port); strResult+=port; System.out.println(strResult); System.out.println("第"+port+"端口已经扫描.......................打开!!"); //这个时侯我需要把port加入返回值中 }catch(IOException e){ System.out.println("第"+port+"端口已经扫描...............关闭"); } }// public String rethread(){// return strResult; //??// }}这样就可以了 String PortRecord;String CurrentPort;for(int i=0;i<30;i++){ try{ InetAddress address=InetAddress.getByName(arg[0]); mythread st=new mythread(address,i); st.start(); CurrentPort=st.rethread(); PortRecord=+CurrentPort; }catch(IOException e){ System.out.println("异常"); } }//****************************************************/// 类名: mythread// 功能: 继承Thread,用于传递参数,得到返回值// 参数: int i 端口//****************************************************/class mythread extends Thread{ private int port; private InetAddress myaddress; public String strResult=new String(); public mythread(InetAddress address,int i){ myaddress=address; port=i; } public void run(){ try{ Socket socket = new Socket(myaddress,port); strResult+=port; System.out.println(strResult); System.out.println("第"+port+"端口已经扫描.......................打开!!"); //这个时侯我需要把port加入返回值中 }catch(IOException e){ System.out.println("第"+port+"端口已经扫描...............关闭"); } } public String rethread(){ return strResult; //?? }}PortRecord is 所有端口 kevindude(kevin)的方法存在问题,mythread中的构造子的参数怎么能用到run()方法中?可以考虑定义一全局变量,但存在一个问题:import java.net.*;import java.io.*;public class scan2{public static String res="";public static void main(String[] args){ for(int i=0;i<100;i++){ try{ InetAddress address=InetAddress.getByName(args[0]); mythread st=new mythread(address,i); st.start(); }catch(IOException e){ System.out.println("异常"); } } while(res.equals("")); //《-------这是一个问题,获得这个值的时间未知。 System.out.println(res);}}//****************************************************/// 类名: mythread// 功能: 继承Thread,用于传递参数,得到返回值// 参数: int i 端口//****************************************************/class mythread extends Thread{ private int port; private InetAddress myaddress; // public String strResult=""; public mythread(InetAddress address,int i){ myaddress=address; port=i; } public void run(){ try{ Socket socket = new Socket(myaddress,port); synchronized (scan2.res){ scan2.res+=port;}// System.out.println(strResult); // System.out.println("第"+port+"端口已经扫描.......................打开!!"); //这个时侯我需要把port加入返回值中 }catch(IOException e){ // System.out.println("第"+port+"端口已经扫描...............关闭"); } } // public String rethread(){// return strResult; //??// }} kevindude可否再解释一下,我不懂,saveResult也可以像C++中的指针一样使用吗?我还不太明白你的意思而且这句也被屏蔽了,这是为何?// public String rethread(){// return strResult; //??// }不过这里好像还没等run执行完就已经return了,结果为空。 lmy2000:编译不通过:FilterThread.java:5: 期望class或interfacepublic static String res=""; ^1 个错误 love722915(xiaojun)的方法忽略了主线程和支线程是并行处理的,有可能你的支线程还没处理(还未检测端口)主线程已经调用了空返回值了。 多谢lmy2000,已经搞定。但有有个问题:我在for执行完后就读取res,而实际上大部分的线程还没有执行完毕,此结果难免不准确。虽然连接成功的速度比连接失败的速度要快多了。 to:lmy2000(pluto) 对不起,是我搞错了,应该是这样 string saveResult=new string(); for(int i=0;i<30;i++){ try{ InetAddress address=InetAddress.getByName(arg[0]); mythread st=new mythread(address,i,saveResult);//将此传递给线程 st.start(); }catch(IOException e){ System.out.println("异常"); } }//****************************************************/// 类名: mythread// 功能: 继承Thread,用于传递参数,得到返回值// 参数: int i 端口//****************************************************/class mythread extends Thread{ private int port; private InetAddress myaddress; public String strResult; public mythread(InetAddress address,int i,string strResult){ myaddress=address; port=i; this.strResult=strResult; } public void run(){ try{ Socket socket = new Socket(myaddress,port); strResult+=port; System.out.println(strResult); System.out.println("第"+port+"端口已经扫描.......................打开!!"); //这个时侯我需要把port加入返回值中 }catch(IOException e){ System.out.println("第"+port+"端口已经扫描...............关闭"); } }// public String rethread(){// return strResult; //??// }}to:AntGhazi(蚂蚁勇士) 首先,线程不是函数,不能返回值。当thread.start被调用后运行的是run()中的代码,其余的函数是不会自动运行的,所以要把所有要运行的代码都放在run()中。至于saveResult它是一个指向string类型的引用,我想在c++中也有这个概念吧。 在love722915(xiaojun)的程序中使用activeCount()检测线程是否已执行完毕,然后统计。String PortRecord;String CurrentPort;for(int i=0;i<30;i++){ try{ InetAddress address=InetAddress.getByName(arg[0]); mythread st[i]=new mythread(address,i); st[i].start(); }catch(IOException e){ System.out.println("异常"); } } while(true) { if(st[0].activeCount()==0) for(int i=0;i<30;i++){ CurrentPort=st[i].rethread(); PortRecord=+CurrentPort; } break; } } Scanner问题 java不借助组件上传图片问题,用最简单的流实现 哪位兄台发MYELCPISE 6或者7的安装 JAVA 中的代理模式是什么意思,与继承之间的区别是什么呢? 多线程服务器端,运行问题 为什么用JXL 操作后生成的EXCEL 文件无法读取啊? 关于applet与javascript交互的问题 求一最佳算法 兄弟我没有几个$,请教JDBC驱动不能加载的问题 要学java了,不知从何开始,忘前辈们指点一下,不胜感激! session?求教大虾 在javamail 里,如何知道哪个是新邮件,盼望指点
for(int i=0;i<30;i++){
try{
InetAddress address=InetAddress.getByName(arg[0]);
mythread st=new mythread(address,i,saveResult);//将此传递给线程
st.start();
}catch(IOException e){
System.out.println("异常");
}
}//****************************************************/
// 类名: mythread
// 功能: 继承Thread,用于传递参数,得到返回值
// 参数: int i 端口
//****************************************************/
class mythread extends Thread{
private int port;
private InetAddress myaddress;
//public String strResult=new String();
public mythread(InetAddress address,int i,string strResult){
myaddress=address;
port=i;
} public void run(){
try{
Socket socket = new Socket(myaddress,port);
strResult+=port;
System.out.println(strResult);
System.out.println("第"+port+"端口已经扫描.......................打开!!"); //这个时侯我需要把port加入返回值中
}catch(IOException e){
System.out.println("第"+port+"端口已经扫描...............关闭");
}
}// public String rethread(){
// return strResult; //??
// }
}
这样就可以了
String CurrentPort;
for(int i=0;i<30;i++){
try{
InetAddress address=InetAddress.getByName(arg[0]);
mythread st=new mythread(address,i);
st.start();
CurrentPort=st.rethread();
PortRecord=+CurrentPort;
}catch(IOException e){
System.out.println("异常");
}
}
//****************************************************/
// 类名: mythread
// 功能: 继承Thread,用于传递参数,得到返回值
// 参数: int i 端口
//****************************************************/
class mythread extends Thread{
private int port;
private InetAddress myaddress;
public String strResult=new String();
public mythread(InetAddress address,int i){
myaddress=address;
port=i;
}
public void run(){
try{
Socket socket = new Socket(myaddress,port);
strResult+=port;
System.out.println(strResult);
System.out.println("第"+port+"端口已经扫描.......................打开!!"); //这个时侯我需要把port加入返回值中
}catch(IOException e){
System.out.println("第"+port+"端口已经扫描...............关闭");
}
}
public String rethread(){
return strResult; //??
}
}PortRecord is 所有端口
import java.io.*;
public class scan2{
public static String res="";
public static void main(String[] args){
for(int i=0;i<100;i++){
try{
InetAddress address=InetAddress.getByName(args[0]);
mythread st=new mythread(address,i);
st.start();
}catch(IOException e){
System.out.println("异常");
}
}
while(res.equals("")); //《-------这是一个问题,获得这个值的时间未知。
System.out.println(res);
}
}
//****************************************************/
// 类名: mythread
// 功能: 继承Thread,用于传递参数,得到返回值
// 参数: int i 端口
//****************************************************/
class mythread extends Thread{
private int port;
private InetAddress myaddress;
// public String strResult="";
public mythread(InetAddress address,int i){
myaddress=address;
port=i;
}
public void run(){
try{
Socket socket = new Socket(myaddress,port);
synchronized (scan2.res){
scan2.res+=port;}
// System.out.println(strResult);
// System.out.println("第"+port+"端口已经扫描.......................打开!!"); //这个时侯我需要把port加入返回值中
}catch(IOException e){
// System.out.println("第"+port+"端口已经扫描...............关闭");
}
}
// public String rethread(){
// return strResult; //??
// }
}
saveResult也可以像C++中的指针一样使用吗?我还不太明白你的意思而且这句也被屏蔽了,这是为何?
// public String rethread(){
// return strResult; //??
// }
不过这里好像还没等run执行完就已经return了,结果为空。
public static String res="";
^
1 个错误
我在for执行完后就读取res,而实际上大部分的线程还没有执行完毕,此结果难免不准确。
虽然连接成功的速度比连接失败的速度要快多了。
对不起,是我搞错了,应该是这样
string saveResult=new string();
for(int i=0;i<30;i++){
try{
InetAddress address=InetAddress.getByName(arg[0]);
mythread st=new mythread(address,i,saveResult);//将此传递给线程
st.start();
}catch(IOException e){
System.out.println("异常");
}
}//****************************************************/
// 类名: mythread
// 功能: 继承Thread,用于传递参数,得到返回值
// 参数: int i 端口
//****************************************************/
class mythread extends Thread{
private int port;
private InetAddress myaddress;
public String strResult;
public mythread(InetAddress address,int i,string strResult){
myaddress=address;
port=i;
this.strResult=strResult;
} public void run(){
try{
Socket socket = new Socket(myaddress,port);
strResult+=port;
System.out.println(strResult);
System.out.println("第"+port+"端口已经扫描.......................打开!!"); //这个时侯我需要把port加入返回值中
}catch(IOException e){
System.out.println("第"+port+"端口已经扫描...............关闭");
}
}// public String rethread(){
// return strResult; //??
// }
}
to:AntGhazi(蚂蚁勇士)
首先,线程不是函数,不能返回值。
当thread.start被调用后运行的是run()中的代码,其余的函数是不会自动运行的,
所以要把所有要运行的代码都放在run()中。
至于saveResult它是一个指向string类型的引用,我想在c++中也有这个概念吧。
String PortRecord;
String CurrentPort;
for(int i=0;i<30;i++){
try{
InetAddress address=InetAddress.getByName(arg[0]);
mythread st[i]=new mythread(address,i);
st[i].start();
}catch(IOException e){
System.out.println("异常");
}
}
while(true) {
if(st[0].activeCount()==0)
for(int i=0;i<30;i++){
CurrentPort=st[i].rethread();
PortRecord=+CurrentPort;
}
break;
}
}