1.程序,进程,线程
2.创建线程
创建线程有三种方式:
- 继承Thread类
- 实现Runable接口
- 实现Callable接口
先尝试继承Thread类
package ThreadTest;
//需要先继承Thread类才可以实现多线程
public class TestThread extends Thread {
public static void main(String[] args) {
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("子线程"+i);
}
}
}
重写了run方法之后,内部执行的就是我们所写的子线程的内容了
再写一下主方法
package ThreadTest;
public class MainThread {
public static void main(String[] args) {
for (int i = 0; i < 8; i++) {
System.out.println("主线程"+i);
}
//创建一个子线程对象,调用刚刚创建的子线程类
TestThread tr = new TestThread();
//子线程不是直接调用run方法,而是先start
tr.start();
for (int i = 0; i < 10000; i++) {
System.out.println("主线程争抢"+i);
}
}
}
首先,主线程里的这个for循环会先走完,在引入多线程后,子线程会和后续的主线程争抢资源,双方交替执行,直到都执行完毕,如下图
3.网络编程
客户端代码
package Socket;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
//套接字,制定服务器和端口号
Socket s = new Socket("192.168.1.19",8888);
//通过流来传送数据
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
//传送数据
dos.writeUTF("你好");
dos.close();
os.close();
s.close();
}
}
服务器端代码
package Socket;
import jdk.internal.util.xml.impl.Input;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
System.out.println("服务器端启动");
//服务器专用套接字,不需要ip
ServerSocket ss = new ServerSocket(8888);
Socket s = ss.accept();
//服务器端接收到的输入流
InputStream is = s.getInputStream();
DataInputStream dis = new DataInputStream(is);
//接受服务端接收到的数据
String str = dis.readUTF();
System.out.println(str);
dis.close();
is.close();
s.close();
}
}
先启动服务器代码,让服务器持续等待获取消息中
然后启动客户端代码,客户端发送消息
服务器端成功接收到消息