`
剑&箫
  • 浏览: 53561 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

多线程总结

    博客分类:
  • Java
阅读更多
1.进程,程序的区别

在上一篇总结中总结了进程与线程的区别,现在来看进程与程序的区别。上一篇总结中已经提到进程是程序在处理机中的一次运行,所以进程是暂时的,程序是永久的。进程有并发性,而程序没有;一个进程可以执行一个或多个程序,同样,一个程序可被多个进程执行。

2.线程的创建方式

在上一篇总结中介绍了线程的一种创建方式,即通过继承Thread类,重写父类run()方法,通过start()方法启动线程。现在总结另外一种线程的创建方式,即通过实现Runnable接口来创建,与第一种创建方法一样,重写父类run()的方法,只是在启动线程时不同,比如定义类public class Listener implements Runnable{  },然后要实例化Listener类对象,比如:
Listener  lt  =  new   Listener(); 然后通过Thread thread = new Thread(lt)这一句创建的thread对象来调用start()方法启动。

3.线程的监听模式

在上一篇总结总结中通过作多线程一个了简单的弹球游戏,该游戏只是解决了球碰到边弹回的问题,球与球碰撞的问题并没有解决。这里通过线程的监听模式解决此问题,该模式要求球不要太多,否则会出问题。前面是实例化了两个Ball类对象的,要实现线程的监听,首先要实例化一个Ball类型的队列,将Ball类的对象加到队列中。然后再增加一个监听进程,该进程的作用是每次取出队列中的两个元素,分别得到它们外切正方形左上角的坐标,再分别和其它元素两两比较判断两个球外切正方形左上角的坐标的距离是否小于或等于它们的半径之后,如果小于它们的半径之和,则说明两个小球碰撞了,则要改变它们的增量,使它们弹回。具体代码如下:

public class Listener extends Thread{

public ArrayList<Ball> list;

public Listener(ArrayList<Ball> list){
this.list = list;
}


public void run(){

while (!Ball.isStop){

while(!Ball.isPause){
//遍历队列
for (int i=0;i<list.size()-1;i++){

Ball b1 = list.get(i);
Ball b2 = list.get(i+1);
System.out.println(b1.x0+" "+b1.y0+"<>"+b2.x0+" "+b2.y0);


if(Math.sqrt((b1.x0-b2.x0)*(b1.x0-b2.x0)+(b1.y0-b2.y0)*(b1.y0-b2.y0))<=30){
b1.x = -b1.x;
b1.y = -b1.y;
b2.x = -b2.x;
b2.y = -b2.y;

}


}

try{
Thread.sleep(50);
}catch(Exception ep){
ep.printStackTrace();
}

}

try{
Thread.sleep(1);
}catch(Exception ep){
ep.printStackTrace();
}


}


}


}

在按钮监听器那边再启动此线程就可以解决两个小球判断的问题了,但是这种方法还是有很大的问题,如果你有更好的方法,请赐教!!

4.线程的控制

线程的控制主要是暂停线程,继续线程和停止线程。还是以上面作的弹球游戏为例,总结线程的控制。首先要在Ball类里面定义两个boolean型的静态变量:isStop和isPase,且默认值都为false。然后在小球移动的move();方法里面增加一个while循环,具体代码如下:
//小球移动的方法
public void move() {

while(!isStop){

while(!isPause){

//清除图像
g.setColor(blf.getContentPane().getBackground());
g.fillOval(x0,y0,30,30);

if (x!=0){
if (x0<=8||x0>=491){//左右两壁
x=-x;
}else if (y0<=30||y0>=591){//上下两壁
y=-y;
}elseif((x0<=8&&y0<=30)||(x0<=8&&y0>=591)||(x0>=491&&y0<=30)||(x0>=491&&y0>=591)){//垂直碰撞四壁
x=-x;y=-y;
}

g.setColor(Color.RED);
g.fillOval(x0+=x,y0+=y,30,30);

}

try{
Thread.sleep(50);
}catch(Exception ep){
ep.printStackTrace();
}


}

try{
Thread.sleep(1);
}catch(Exception ep){
ep.printStackTrace();
}

}

}

然后再在窗体类那边添加一个“停止”的按钮,用String command = e.getActionCommand();语句得到按钮上的字符串。再根据得到的字符串是否是等于“开始”,如果等于,则启动前面的两个进程,setText("暂停");语句改变按钮上的字为“暂停”,当得到的字符串等于“暂停”,则把按钮上的字改为“继续”,如果得到的字符串等于“继续”,则把按钮上的字改为“暂停”,如果得到的字符串等于“停止”,则把“暂停”按钮改为“开始”,具体代码如下:
//匿名内部类,动作监听器
ActionListener atl = new ActionListener(){

public void actionPerformed(ActionEvent e){

String command = e.getActionCommand();

if (command.equals("开始")){

Listener lt = new Listener(list,BallFrame.this);
lt.start();


Ball b = new Ball(BallFrame.this);
b.start();
list.add(b);

Ball b1 = new Ball(BallFrame.this);
b1.start();
list.add(b1);

bt.setText("暂停");

}

if (command.equals("暂停")){

bt.setText("继续");
}

if (command.equals("继续")){

      bt.setText("暂停");
}

if (command.equals("停止")){

bt.setText("开始");
}

}


};

要实现线程的暂停,继续和结束,就要在Ball类里面各自定义静态方法改变isStop和isPause的值而使move()里面的两个循环停止与开始就可以了,具体代码如下:
//暂停的方法
public static void pauseThread(){
isPause=true;
}

//继续的方法
public static void resumeThread(){
isPause=false;
}

//停止的方法
public static void stopThread(){
isPause=true;
isStop=true;
}

//初始的方法
public static void initThread(){
isPause=false;
isStop=false;
}

然后再在监听器那边直接调用这些方法就行了,如下代码所示:
//匿名内部类,动作监听器
ActionListener atl = new ActionListener(){

public void actionPerformed(ActionEvent e){

String command = e.getActionCommand();

if (command.equals("开始")){

Ball.initThread();

Listener lt = new Listener(list,BallFrame.this);
lt.start();


Ball b = new Ball(BallFrame.this);
b.start();
list.add(b);

Ball b1 = new Ball(BallFrame.this);
b1.start();
list.add(b1);

bt.setText("暂停");

}

if (command.equals("暂停")){
Ball.pauseThread();

bt.setText("继续");
}

if (command.equals("继续")){

Ball.resumeThread();
bt.setText("暂停");
}

if (command.equals("停止")){

Ball.stopThread();
bt.setText("开始");
}

}


};
至此,通过两个按钮就可以实现线程的暂停、继续与结束,从而使小球暂停移动、继续移动和重新开始。
2
5
分享到:
评论

相关推荐

    java多线程总结(一)

    java多线程总结

    C#.net同步异步SOCKET通讯和多线程总结2[参照].pdf

    C#.net 同步异步 SOCKET 通讯和多线程总结 本文旨在总结 C#.net 中的同步异步 SOCKET 通讯和多线程编程,涵盖服务端和客户端的实现细节。 一、服务端实现 服务端使用 System.Net 和 System.Net.Sockets 命名空间...

    windows多线程总结

    【Windows多线程总结】 Windows操作系统提供了一套完整的API来支持多线程编程,使得开发者可以在同一进程中同时执行多个线程,实现并发处理任务。本文将深入探讨Windows多线程编程的基本概念、线程同步、线程池以及...

    C#.net同步异步SOCKET通讯和多线程总结

    C#.net同步异步SOCKET通讯和多线程总结 C#.net同步异步SOCKET通讯和多线程总结是指在C#.net环境下实现的同步异步套接字通信和多线程编程的总结。套接字(Socket)是tcp/ip网络协议接口,内部定义了许多的函数和例程...

    C++多线程总结[归纳].pdf

    C++多线程总结 本文档对C++多线程编程进行了总结,介绍了三种创建线程的方法:CreateThread函数、AfxBeginThread函数和_beginthread()/_beginthreadex()函数,同时对线程的管理和终止进行了详细的讲解。 ...

    JAVA多线程总结

    【JAVA多线程总结】 Java 多线程是Java编程中的关键特性,它允许程序同时执行多个任务,提高系统的效率和响应性。本篇总结涵盖了Java多线程的基础概念、创建与启动、线程调度、同步与协作以及新特性。 **一、Java...

    java多线程总结(二)

    java多线程总结

    Java多线程总结.pdf

    Java多线程总结.pdf

    C#dotnet同步异步SOCKET通讯和多线程总结

    C#dotnet同步异步SOCKET通讯和多线程总结

    [C#通信二]C#.net同步异步SOCKET通讯和多线程总结

    C#.net同步异步SOCKET通讯和多线程总结 同步套接字通信 Socket支持下的网上点对点的通信 服务端实现监听连接,客户端实现发送连接请求,建立连接后进行发送和接收数据的功能 服务器端建立一个socket,设置好本机的ip...

    MFC 多线程总结

    在Windows应用程序开发中,MFC(Microsoft Foundation Classes)框架提供了对多线程的支持,使得开发者可以构建更加复杂的并发系统。MFC中的线程分为两类:工作者线程和用户界面线程,它们各自有不同的特性和用途。 ...

    Java并发编程实践(java concurrency in practice)pdf (java多线程总结.ppt)

    配合`JAVA多线程总结.ppt`,你可以得到一个更直观和简洁的概览,快速回顾和掌握上述关键知识点。虽然中文版翻译可能存在不足,但原版英文书籍通常能更准确地传达作者的意图和细节,值得深入阅读。

    java多线程总结

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关知识点,包括线程的创建、线程的状态、同步机制以及线程安全问题。 1. **线程的创建*...

    CSOCKET同步异步通讯与多线程总结[定义].pdf

    CSOCKET同步异步通讯与多线程总结[定义].pdf

    JavaSE专题-多线程总结.doc

    多线程的常见问题总结分析 1、多线程技术介绍 2、主线程介绍 3、创建线程的方式 4、线程中的异常问题 5、线程运行状态 6、线程第二种创建方式 7、多线程练习 8、线程安全问题分析和解决 9、多线程细节 10、同步使用...

    Java编程中多线程总结

    关于Java编程中多线程的总结,是很难得的一个具有总结性的文档。

    C# 多线程总结

    本文将对C#多线程进行详细总结,包括如何创建线程、同步问题以及使用不同的同步机制。 1. 创建线程 1.1 异步委托方式 异步委托是通过.NET线程池创建线程的方法,这些线程默认为后台线程。使用BeginInvoke启动异步...

Global site tag (gtag.js) - Google Analytics