原创

重拾java-坦克大战+线程基础


java绘图技术

Jream 画框 
paint(Graphics q) 画图工具
repaint() 刷新组件的外观

1

常用方法

1 package demo1;

import javax.swing.*;
import java.awt.*;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: 曾豪杰
 * @Date: 2022/10/27/14:31
 * @Description:
 */
@SuppressWarnings("all")
public class home {


	public static void main(String[] args) {
			new draw();
	}

	static class draw extends JFrame{

		private MyPanel myPanel=null;
		public draw() {
			myPanel=new MyPanel();
			this.add(myPanel);

			this.setSize(500,500);
			this.setVisible(true);
			this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

		}
	}

   static class MyPanel extends JPanel{

		@Override
		public void paint(Graphics g) {
			super.paint(g);
			画直线
			g.drawLine(10,10,100,100);
			画矩形边框
			g.drawRect(10,10,100,100);
			画椭圆边框
			g.drawOval(10,10,200,200);
			填充矩形
			g.setColor(Color.blue);//设置颜色
			g.fillRect(10,10,200,200);
			填充椭圆
			g.setColor(Color.cyan);
			g.fillOval(10,10,200,200);
			填充图片
			获取图片资源  放在out 下
			Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/2.png"));
			g.drawImage(image,10,10,300,320,this);
			画字符串
			设置颜色和字体
			g.setFont(new Font("隶书",Font.BOLD,50));
			g.setColor(Color.black);
			g.drawString("java go no!!",100,100);
		}
	}
}
绘制坦克

1

事件处理机制 (接口 KeyListener)
		//输入字符串 触发事件
		@Override
		public void keyTyped(KeyEvent e) {

		}
		//按下键 触发事件
		@Override
		public void keyPressed(KeyEvent e) {//上下左右

			if (e.getKeyCode()==KeyEvent.VK_DOWN){
				y++;
			}else if (e.getKeyCode()==KeyEvent.VK_UP){
				y--;
			}else if (e.getKeyCode()==KeyEvent.VK_LEFT){
				x--;
			}else if (e.getKeyCode()==KeyEvent.VK_RIGHT){
				x++;
			}
			repaint();
		}
		//松开 触发事件
		@Override
		public void keyReleased(KeyEvent e) {

		}

1

小结

1

线程

进程: 正在运行,一次执行过程,动态过程

1

线程:由进程创建 ,是进程的一个实体

1

单线程: 同一时刻,只能执行一个线程
多线程: 同一时刻,能执行多个线程

1

并发:
并行:

1

线程类结构(2种方式)

1

主线程main,与子线程thred-0 互不干扰 主线程结束 毫无关系

1

注意:
run 只是一个普通方法 是串行 和main线程 绑定一起 ,执行完之后在执行

start 是添加 新线程 并行 互不影响 底层是start0()

真正执行线程的是start0()方法 ,start方法
runnable 接口
开线程 必须要代理 使用 Thread(Object o);调用 sart() 里面的 start0();不然只能使用 run main线程
runnable 和 Thread 的区别
单继承 与 多实现 的区别 ,一个资源 共享 区别

1

线程终止
	主线程 通过 变量 终止 子线程 

1

·

多线程 售卖问题 Thred 和 Runnable 接口
同步 和 互斥 问题
线程常用方法

1

线程礼让 和 线程插队
礼让yield: 不一定成功
插队join:线程插队 一定执行任务

1

守护线程 和 工作线程
守护线程:一般为工作线程服务的 工作线程无 守护无 并存
工作线程:工作线程也叫用户线程 当线程任务结束 会通知执行完毕

1

线程的6大状态
new(未启动) runnable(运行) blocked(锁) waitting(等待) timed-waitting(任务等待) terminated (退出状态)

1

运行内存:

1

线程同步机制(互斥锁) (同一个对象 runnable接口)
Synchronized 对象同步锁 用了上锁,解决超卖问题

1

demo:解决超卖问题

1

1

线程互斥锁

1

线程互斥锁的注意事项:
同步方法(静态的)为当前类本身 java.class
同步方法(非静态的)的锁为当前 this
分析上锁的代码是否为静态 对象是否同一个

1

线程的死锁
当两个线程 分别拿到了对方的锁 但对方又想拿自己的锁就会产生死锁现象

死锁demo:

1

线程的释放锁(synchronized)
1 . 同步方法,同步代码块 执行结束
2 . 同步方法,同步代码块中 出现了  遇到了break,return
3 . 同步方法,同步代码块中 出现了 error 和 exception
4 . 同步方法,同步代码块中 执行了 wait()暂停,释放锁

1

不会释放锁
1 . sleep方法,yield方法
2 . suspend方法 挂起方法 (避免使用)

1

学校
总结
经验
  • 作者:阿杰(联系作者)
  • 发表时间:2022-10-27T11:07:45
  • 版权声明:杰出版
  • 公众号:--无
  • 评论