我正在用java编写TCP套接字应用程序,我有点怀疑如何以线程保存方式进行。
在此示例中,静态方法startServer(int port)创建一个被动TCP套接字。在main中,我等待传入连接,这将通过专用线程进行管理。
首先,我真的很想了解线程之间的相互作用。
让A,B两个同一个类的实例:
- A的实例属性不是来自B;
- 从A和B都可以看到静态属性。
醇>让T1,T2两个同一类的线程:
- 属性可见性是否与使用的方式相同 实例?换句话说,只能共享静态属性 线程?
- 非静态属性始终是线程安全的吗?
醇>
在这个代码线程安全吗?
import java.io.*;
import java.net.*;
import java.util.*;
public class MultithreadServer extends Thread
{
private Socket client;
private String nonStaticAttribute;
private static volatile Vector<String> clientsVector;
public MultithreadServer(Socket c, String enc)
{client = c;
nonStaticAttribute = new String("val=" + Math.random());}
/** create a passive socket*/
public static ServerSocket startServer() throws BindException, IOException
{clientsVector= new Vector<String>();}
public void run()
{
try
{
MultithreadServer.clientsVector.addElement(clientName); // Does this variable shared in a thread-safe way between threads? Vector in internally Synchronized
while(true)
{
/** does this line print a different values for each thread? (the value that was assigned in the costructor?)
Or all thread will display the same value (the value of the costructor of the last thread ? ) */
System.out(nonStaticAttribute);
Thread.sleep(1000);}
}
catch(IOException e)
{}
}
}
/** main */
public static void main(String[] argv) throws IOException
{ // Start del server
myClass.startServer();
myClass t1 = new myClass();
t1.start();
myClass t2 = new myClass();
t2.start();
....
myClass tn = new myClass();
tn.start();
}
}
如果我已经正确理解,locals实例属性是线程安全的,因为它们有自己的状态(在这种情况下,多个线程像多个istances一样独立工作)。
在我看来,静态Vector的使用也是线程保存,但仅仅因为Vector是内部同步的。
如果我使用像文件一样的非同步资源呢?
public class myClass extends Thread {
// same code as the other example
private final static File file = new File("rubrica.txt");
void run() {
.....
synchronized (file)
{FileWriter fout= new FileWriter(file,true);
fout.write("add some content at the end");
fout.flush();
fout.close();
}
}
我真的很感激任何帮助。
祝你今天愉快!)