J2se(13)--------线程

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;



}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值