J2se(13)
线程
------------------
回顾:
创建的线程的两种方式:
1、编写类继承于Thread类
2、编写类实现Runnable接口
线程的线程体是run方法
线程安全:
存了3000元到银行(银行卡\存折)
自己拿银行卡
老婆拿存折
--------------------------------------------
自己先拿银行卡到柜台取2000元,
1、银行的工作人员先检查帐户的余额是否足够(余额足够)
--------------------------------->>>>>>>>>>>>>>>>>>>
2、准备支付2000元
3、支付以后,帐户余额减去2000元
------------------------------------------------------------------------------
老婆拿存折到另一银行取钱:
1、检查余额是否足够(余额足够)
2、准备支付2000
3、支付以后,帐户余额减去2000元
造成此情况发生的原因是: 一个线程在方法休眠的过程中,另一个线程进入到方法中,攥改了数据
----------------------解决这种情况发生的办法是:
只要方法中存在一个线程,其他线程就不允许再进入该方法,直达方法中的线程退出,其他线程才可以进入
-----------同过"方法同步"就可以实现这个效果
synchronized:它修饰方法表示,如果方法中存在一个线程,必须等待该线程退出该方法以后,其他线程才能再次进入方法
第一种写法:
public synchronized void 方法名(){
}
第二种写法:
public void 方法名(){
synchronized(this){
代码
}
}
打字游戏
---------------------------------------------------------
第一个阶段
1、绘制窗体
2、在窗体上放置JMenuBar
3、在JMenu中放置两个JMenuItem (开始\停止)
4、把窗体的布局方式更改为:绝对定位
5、在窗体中放置一个JPanel
6、给第3步添加的"开始","停止"按钮添加单击事件
--------------------------------------------------------
第二个阶段(当点击“开始"降落一个文字)
1、在类中创建一个全局变量 Random rd =new Random();随机数类
2、创建一个全局变量 boolean flag=true;//用于标识游戏继续还是停止
3、编写一个线程类,用于产生一个字母,向下降落 (定义成内部类)---------线程B
a、编写一个类继承于JLabel同时,实现Runnable接口
b、在类中,定义两个属性 int x,y;用于保存当前标识的横纵坐标
c、在定义一个构造方法,在构造方法中,定义标识的初始信息
----以下代码均在构造方法中编写
d、产生一个97---122之间的随机数
int val = 97+rd.nextInt(26);
e、把val强制转换成char类型的数据
char c = (char)val;
f、把char类型,转换成String
String s = String.valueOf(c);
g、创建一个变局变量,用于设置字体的大小
Font f = new Font("隶书",Font.Bold,40);
h、设置标识的字体大小为指定字体
this.setFont(f);
i、随机计算标签出现在容器中的x坐标 (y=0)
x = rd.nextInt(463);
j、设置this在JPanel的坐标,以及宽度与高度
this.setBouns(x,y,width,height)
k、把当前this添加到jpanel中 : jPanel1.add(this);
4、在当前类的run()方法,编写如下代码
a、判断当前如果y值小于jpanel的高度,当前this的位置就向下移动
try{
while(y<399){
if(flag){
Thread.sleep(30);
y++;
this.setLocation(x,y);
}
}
}catch(){
}
5、在开始按钮中,启动线程B,让文字降落
6、编写匿名内部类,关闭窗体
7、在线程B中,增加一个方法,随机的生成一种颜色
public Color getColor(){
int r = rd.nextInt(200);
int g = rd.nextInt(200);
int b = rd.nextInt(200);
return new Color(r,g,b);
}
8、在线程B的构造方法中,设置标签的文字颜色
this.setForeground(getColor());
----------------------------------------------------------------------------
9、编写一个线程A,用于控制产生文字的数量
A、编写类 继承于 Thread
B、重写run()
public void run(){
try{
while(flag){
sleep(500);
线程B obj = new 线程B();
Thread t = new Thread(obj);
obj.start();
}
}catch(){
}
}
10、在开始按钮中,启动线程A
11、按键以后,让对应的文字消失
A、先窗体添加keyListener--->keyPressed
B、在事件对应的方法,先得到用户按下的是哪一个字母
char c = evt.getKeyChar();
C、把字符,转换成字符串
String s = String.valueOf(c);
D、取到JPanel中的所有组件
Component[] cmps = jPanel1.getComponents();
E、对所有的组件,循环
for(Component t :cmps){
JLabel lab = (JLabel)t;
}