解释一下 public myThread(String ip, int port, GUIClient GUI) { this.GUI = GUI; try { soc = new Socket(ip, port); //发送信息。 out = new PrintWriter(soc.getOutputStream(), true); //读取信息。 in = new BufferedReader(new InputStreamReader(soc.getInputStream())); } catch (Exception e) { System.out.println(e); } start(); }
时间: 2023-06-09 17:02:41 浏览: 96
这是一个公开的类,名为myThread,它有三个参数,分别是ip(String类型)、port(int类型)和GUI(GUIClient类型)。在这个类内部,它会创建一个Socket对象,用于连接指定的ip和端口,然后创建一个PrintWriter对象和一个BufferedReader对象,分别用于发送和接收信息。最后,它会调用start()方法启动这个线程。这个类的作用是在网络上与其他计算机通信,并能够实时地将通信内容显示在GUI客户端上。
相关问题
1. class MyThread extends Thread { public void run() { // 线程执行的代码 }}// 在主函数中创建并启动线程MyThread thread = new MyThread();thread.start(); 2. class MyRunnable implements Runnable { public void run() { // 线程执行的代码 }}// 在主函数中创建并启动线程MyRunnable runnable = new MyRunnable();Thread thread = new Thread(runnable);thread.start(); 3. class PrintThread extends Thread { private String message; private int count; private int sleepTime; public PrintThread(String message, int count, int sleepTime) { this.message = message; this.count = count; this.sleepTime = sleepTime; } public void run() { for (int i = 0; i < count; i++) { System.out.print(message); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } } }}// 在主函数中创建并启动线程PrintThread threadA = new PrintThread("a", 10, 100);PrintThread threadB = new PrintThread("b", 10, 200);threadA.start();threadB.start();分析这三个代码,并解释它们是如何实现的
这三段代码都是用来创建和启动线程的。其中,第一段代码是继承了Thread类,重写了run()方法;第二段代码是实现了Runnable口,重写了run()方法;第三段代码也是继承了Thread类,但是构造函数中传入了一些参数,使得线程在运行时可以打印指定的字符串、次数和间隔时间。
在第一段代码中,创建一个MyThread类的实例对象thread,然后调用start()方法启动线程。线程执行的代码在重写的run()方法中实现。
在第二段代码中,创建了一个MyRunnable类的实例对象runnable,然后将其作为参数传递给Thread类的构造函数,创建一个Thread类的实例对象thread,并调用start()方法启动线程。线程执行的代码在重写的run()方法中实现。
在第三段代码中,创建了两个PrintThread类的实例对象threadA和threadB,构造函数中传入了"a"和"b"两个字符串、10次打印和不同的间隔时间。然后分别调用start()方法启动线程。线程执行的代码在重写的run()方法中实现,在循环中打印指定的字符串、休眠指定的时间。
public class DLTest { public static void main(String[] args) { String str = "ABC"; MyThread myThread = new MyThread(str); myThread.start(); synchronized (str){ System.out.println("str 变量的哈希值为:" + str.hashCode()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } try { myThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("main is over"); } } class MyThread extends Thread{ String string; MyThread(String str){ this.string = str; } @Override public void run() { synchronized (string){ System.out.println("string 变量的哈希值为:" + string.hashCode()); } } }这段代码为什么没有死锁
这段代码没有死锁是因为主线程和 MyThread 线程在使用同步块时,都是在不同的时间段内使用的,因此不会产生互相等待对方释放锁的情况。
具体来说,主线程首先创建 MyThread 对象并启动了它的线程,然后获取了 str 对象的锁,并执行同步块中的代码。在这段代码执行过程中,MyThread 线程一直处于等待状态。
当主线程释放了 str 对象的锁后,MyThread 线程才获取了该锁,并执行了同步块中的代码。因为主线程已经释放了该锁,所以 MyThread 线程可以顺利地获取到该锁,避免了死锁的产生。
在主线程中,通过调用 myThread.join() 方法,主线程等待 MyThread 线程执行完毕后再结束,这也确保了 MyThread 线程在主线程结束前能够执行完毕。
阅读全文