异常的两种处理方法:(1)try-catch(重点);(2)在函数头部声明
继承Thread类:
package multithreading.test;
// 1.创建一个继承于Thread类的子类
class MyTest extends Thread {
// 2.重写Thread类中的run()
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(1);
}
}
}
public class Test {
public static void main(String[] args) {
// 3.创建Thread类的子类的对象
MyTest t1 = new MyTest();
// 4.通过此对象调用start
t1.start();
for (int i = 0; i < 1000; i++) {
System.out.println("hello");
}
}
}
实现Runnable接口:
package multithreading.test;
public class Test2 implements Runnable{
@Override
public void run(){
for (int i = 0; i < 1000; i++) {
System.out.println(1);
}
}
public static void main(String[] args){
Thread t1 = new Thread(new Test2());
t1.start();
for (int i = 0; i < 1000; i++) {
System.out.println("hello");
}
}
}
采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相 同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
package network.work;
import java.io.*;
import java.net.*;
public class Url {
public static void main(String[] args) {
try {
URL url = new URL("https://cdn.jsdelivr.net/gh/YuJiZhao/picbed/108.jpg");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.connect();
InputStream is = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream("yuanshen.png");
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
is.close();
fos.close();
urlConnection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务端:
package network.work;
import java.io.*;
import java.net.*;
public class Work3_server {
public static void main(String[] args) {
try{
//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(10086);//1024-65535的某个端口
//2、调用accept()方法开始监听,等待客户端的连接
Socket socket = serverSocket.accept();
//3、获取输入流,并读取客户端信息
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info =null;
while((info=br.readLine()) != null){
System.out.println("我是服务器,客户端说:" + info);
}
socket.shutdownInput();//关闭输入流
//4、获取输出流,响应客户端的请求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();
//5、关闭资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
客户端:
package network.work;
import java.io.*;
import java.net.*;
public class Work3_client {
public static void main(String[] args) {
try{
//1、创建客户端Socket,指定服务器地址和端口
Socket socket = new Socket("localhost",10086);
//2、获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream();//字节输出流
PrintWriter pw = new PrintWriter(os);//将输出流包装成打印流
pw.write("用户名:admin;密码:123");
pw.flush();
socket.shutdownOutput();
//3、获取输入流,并读取服务器端的响应信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info=br.readLine()) != null){
System.out.println("我是客户端,服务器说:" + info);
}
//4、关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Label构造函数:
Label类的方法定义:
TextField类的构造函数:
TextField类的常用方法:
TextArea类的属性:
TextArea类的构造函数
TextArea类的常用办法
Button类的构造函数
Button 类的常用办法
Choice类的构造函数
掌握常用的容器Frame,Panel的使用(知道四种容器:(1)Window ,Frame——默认布局BorderLayout;(2)Panel,Applet)——默认布局FlowLayout
容器的最常用的方法add(),setLayout(),setSize(),setVisible()
package GUI;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test3 {
public static void main(String[] args) {
Frame frame = new Frame();
// 布局的概念
Panel panel = new Panel();
// 设置布局
frame.setLayout(null);
// 坐标
frame.setBounds(300, 300, 500, 500);
frame.setBackground(new Color(100, 80, 200));
// panel设置坐标, 相对于frame
panel.setBounds(50, 50, 400, 400);
panel.setBackground(Color.red);
// 将面板添加至frame
frame.add(panel);
// 设置可见性
frame.setVisible(true);
// 添加监听事件,监听窗口关闭事件 System.exit(0)
// 适配器模式
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// 程序关闭要做的事情
// 结束程序
System.exit(0);
}
});
}
}
计数器案例:
package GUI;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Objects;
public class Test7 {
static int num = 0;
public static void main(String[] args) {
// 窗口
Frame frame = new Frame("Counter");
frame.setVisible(true);
frame.setSize(400, 350);
// 显示面板
Panel showPanel = new Panel(null);
showPanel.setBounds(0, 0, 400, 275);
TextField textfield = new TextField("0");
textfield.setBounds(50, 37, 300, 200);
showPanel.add(textfield);
// 操作面板
Panel operPanel = new Panel();
operPanel.setBounds(0, 275, 400, 75);
Button addbtn = new Button("+");
Button redbtn = new Button("-");
operPanel.add(addbtn);
operPanel.add(redbtn);
// 布局
// frame.setLayout(new FlowLayout()); // 流式布局
frame.add(showPanel, BorderLayout.NORTH);
frame.add(operPanel, BorderLayout.SOUTH);
// 事件
AddActionListener myAddActionListener = new AddActionListener(textfield, num);
addbtn.addActionListener(myAddActionListener);
redbtn.addActionListener(myAddActionListener);
// 窗口可关闭
frame.addWindowListener(
new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
}
}
// 点击事件
class AddActionListener implements ActionListener {
TextField textfield;
int num;
AddActionListener(TextField textfield, int num) {
this.textfield = textfield;
this.num = num;
}
@Override
public void actionPerformed(ActionEvent e){
String s = e.getActionCommand();
if (Objects.equals(s, "+")) num += 1;
if (Objects.equals(s, "-")) num -= 1;
this.textfield.setText(String.valueOf(num));
}
}
如果有兴趣了解更多相关知识,欢迎来到我的个人网站看看:eyes++的个人空间