`
zhuozhuobeauty
  • 浏览: 18054 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

线程总结~三水鉴定:很有用的东东

    博客分类:
  • java
 
阅读更多

一、进程与线程的区别
线程:一个程序执行多个任务,一个任务就是所谓的线程,可以运行一个以上的线程程序

称之为多线程程序
进程:简而言之,运行着的应用程序可以成为进程,注意不运行的不称之为进程
线程和进程比较:线程开销小。可共享数据。进程开销大,各个进程之间是相互独立。
二、线程的执行顺序问题
我们来看下面这样一个简单线程
ma{
mb();
md();
println("a");
}
mb{
mc();
println("b");
}
mc{
println("c");
}
md(){
println("d");
}
输出结果必然是c,b,d,a.这是一个按照顺序执行的单线程程序。
若我们想要多个任务同时运行,及实现多线程,则需要用到如下格式的代码:
public class ThreadDemo extends Thread {
            //主函数,属性方法
         }
再看如下一个程序,运行的结果是混乱的,难以预料的。
public class ThreadDemo extends Thread {

private static int count = 0;
private int id;

/**
* @param args
*/
public static void main(String[] args) {
for(int i=1;i<=5;i++){
ThreadDemo td = new ThreadDemo(i);
td.start();
System.out.println("第"+i+"号线程启动了......");
}
}

public ThreadDemo(int id) {
this.id = id;
}

public void run() {
test();
}

public void test() {
while (count <= 20) {
count++;
System.out.println("线程" + id + "正在执行,count的值

是:" + count);
}
}
为了使线程的运行有规律可循,我们通过一个Thread.sleep(n);方法来实现,其中n代表

暂停的毫秒数。但要注意,根据错误提示,要变成
               try {
Thread.sleep(id*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
三、写线程要注意的几点
1.调用线程的时候,一定要注意让线程start起来,没有start线程是不启动的
2.继承Thread类的时候要重写run方法~
四、关于弹球练习的总结
目前的小球还很多bug,非常低级,比如,弹着弹着就少了一个球。。。先贴一下代码,求大神指点

,待我修改以后再把正确的代码贴出~
**主线程
package xiancheng;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;

/**
* 小球移动界面类
*
* @author XiongXiangJun
*
*/
public class Balltry extends JFrame {

public static void main(String[] args) {
Balltry bt = new Balltry();
bt.initGUI();
}

private void initGUI() {
this.setTitle("小球移动");
this.setSize(new Dimension(600, 500));
this.setDefaultCloseOperation(3);
this.setLocation(0, 0);
this.setResizable(false);
this.setVisible(true);
ball1.start();
ball2.start();
}

Ball ball1 = new Ball(Color.BLUE, 20, 50, 30,this);
Ball2 ball2 = new Ball2(Color.YELLOW, 500, 20, 30,this);

/**
* 重写重绘方法
*/
public void paint(Graphics g) {
super.paint(g);

g.setColor(ball1.getColor());
g.fillOval(ball1.getX(), ball1.getY(), ball1.getWidth(), ball1.getWidth());
g.setColor(ball2.getColor());
g.fillOval(ball2.getX(), ball2.getY(), ball2.getWidth(), ball2.getWidth());
}

}
**继承Thread的Ball类
package xiancheng;

import java.awt.Color;
import java.util.Random;

/**
* 小球类,小球要能独立的运行,所以让它继承自Thread
*
* @author XiongXiangJun
*
*/
public class Ball extends Thread {

// 小球的颜色
private Color color;
// 小球的起始坐标和宽高
private int x, y, width;
private Balltry bt;

/**
* 构造方法
*
* @param color颜色
* @param x起始点x
* @param y起始点y
* @param width小球的宽度
* @param hegiht小球的高度
*/
public Ball(Color color, int x, int y, int width,Balltry bt) {
this.color = color;
this.x = x;
this.y = y;
this.width = width;
this.bt = bt;
}

/**
* 线程的执行方法
*/
public void run() {
boolean flag = true;
// 让小球不停的运动起来
while(true){
while (flag) {

Random rand = new Random();
x += rand.nextInt(50);
y += rand.nextInt(50);
if(x<560&&y<460){
//调用重绘方法
bt.repaint();
try {
// 让线程休眠0.5秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else
{flag = false;

}

}
while(!flag)
{
Random rand = new Random();
x -= rand.nextInt(100);
y -= rand.nextInt(100);
if(x>30&&y>30){
bt.repaint();


try {
// 让线程休眠0.5秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else flag = true;
}
}
}

public Color getColor() {
return color;
}

public void setColor(Color color) {
this.color = color;
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}

public int getWidth() {
return width;
}

public void setWidth(int width) {
this.width = width;
}



}
**继承Thread的Ball2类
package xiancheng;

import java.awt.Color;
import java.util.Random;

/**
* 小球类,小球要能独立的运行,所以让它继承自Thread
*
* @author XiongXiangJun
*
*/
public class Ball2 extends Thread {

// 小球的颜色
private Color color;
// 小球的起始坐标和宽高
private int x, y, width;
private Balltry bt;

/**
* 构造方法
*
* @param color颜色
* @param x起始点x
* @param y起始点y
* @param width小球的宽度
* @param hegiht小球的高度
*/
public Ball2(Color color, int x, int y, int width,Balltry bt) {
this.color = color;
this.x = x;
this.y = y;
this.width = width;
this.bt = bt;
}

/**
* 线程的执行方法
*/
public void run() {
boolean flag = false;
// 让小球不停的运动起来
while(true){
while (flag) {

Random rand = new Random();
x += rand.nextInt(100);
y += rand.nextInt(150);
if(x>20&&y<450){
//调用重绘方法
bt.repaint();
try {
// 让线程休眠0.5秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else
{flag = false;

}

}
while(!flag)
{
Random rand = new Random();
x -= rand.nextInt(150);
y += rand.nextInt(50);
if(x<550&&y>40){
bt.repaint();


try {
// 让线程休眠0.8秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else flag = true;
}
}
}

public Color getColor() {
return color;
}

public void setColor(Color color) {
this.color = color;
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}

public int getWidth() {
return width;
}

public void setWidth(int width) {
this.width = width;
}



}

  • 大小: 13.5 KB
分享到:
评论

相关推荐

    线程间通信方式3:消息传递方式

    在多线程编程中,线程间通信是一个关键的概念,用于协调不同线程之间的操作,确保数据的一致性和正确性。本示例“线程间通信方式3:消息传递方式”着重介绍了通过消息传递实现线程间的通信。下面将详细阐述这种通信...

    “线程间操作无效: 从不是创建控件“…”的线程访问它”的解决办法

    文档中讲解了C#中在使用多线程,跨线程操作时报错“线程间操作无效: 从不是创建控件“…”的线程访问它”的解决办法。

    Java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 ...Java线程:大总结

    启动两个线程,一个线程打印1~52,另一个线程打印A~Z

    启动两个线程,一个线程打印1~52,另一个线程打印A~Z

    Thread线程和ThreadPool线程池 Thread:我们可以开启一个线程

    Thread线程和ThreadPool线程池 Thread:我们可以开启一个线程。但是请大家记住:线程开启会在空间和时间上有不小的开销。所以,不能随便开。 ThreadPool:会根据你的CPU的核心数开启一个最合适的线程数量。如果你...

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    a: 创建一个线程 b: 创建多个线程 c: 多线程访问同一资源 d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 g: 利用互斥量来解决线程同步互斥问题 h: problem1 生产...

    C++ 定时器 线程的使用

    本项目提供了一个简单的C++定时器与线程使用的示例,对于初学者来说是一个很好的学习起点。下面将详细解释这两个概念以及它们在C++中的实现方式。 首先,我们来了解一下**定时器(Timer)**。定时器主要用于在指定的...

    多线程编程教程——作者:韩耀旭

    这些任务如果在一个单线程环境下运行,很容易导致整个应用程序在执行这些任务期间变得无响应,即所谓的“死机”现象。为了解决这个问题,提高程序的响应速度和整体性能,引入多线程编程成为一种必要的技术手段。 ##...

    线程间通信方式2:参数传递方式

    在多线程编程中,线程间的通信是一个关键概念,特别是在并发执行任务时,确保数据的一致性和正确性。本文将详细探讨“线程间通信方式2:参数传递方式”,并通过对不同创建线程方法的分析,展示如何有效地传递参数。 ...

    多线程管理框架支持超时退出任务回调处理

    一直用线程池,但有些时候发现线程池无法控制结束某个超时等待的线程任务,所以就勉为其难的自己写了个线程管理~。作用:模仿线程池操作,管理多线程任务,超时,以及完成任务的回调。如果有bug自行处理,服务器挂机...

    java线程安全总结.doc

    以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一块代码时,如果每个线程都能得到预期的结果,且不产生数据不一致或同步问题,那么这块代码就被称为线程安全的。Java中的...

    Java_多线程编程线程:大总结

    ### Java多线程编程大总结 #### 一、Java多线程编程的演进与重要性 Java多线程编程自Java 5之后经历了显著的革新与扩展,引入了强大的并发包,极大地增强了多线程编程的能力。在Java 5之前,多线程的支持较为薄弱...

    windows多线程总结

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

    线程及线程应用总结

    线程在IT行业中是多任务并行处理的关键概念,它使得程序可以在同一时间执行多个不同的任务,极大地提高了程序的效率和响应性。本篇将基于提供的文件名来探讨线程的相关知识点及其应用。 1. **线程基础** - 线程是...

    JAVA多线程总结

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

    java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** 当前的操作系统通常都是多任务操作系统,多线程是一种实现多任务的方式之一。在操作系统层面,进程指的是内存中运行的...

    Java线程总结教程

    ### Java线程总结教程知识点详解 #### 一、操作系统与多线程概念 - **多任务与分时操作系统**:现代操作系统(如Windows、Linux)能够实现多任务处理,即在用户看来似乎多个应用程序在“同时”运行。实际上,这是...

    64位VEH调试器,从控制台获取用户输入的命令

    //查看所有线程: ~* 查看线程1的栈: ~1 查看线程所有信息包括堆栈: ~* -a //查看进程内存属性 lmm //查看句柄!handle 查看h1 !handle h1 , !handle rcx //查看窗口lwd //resume线程 ~1 m resume all线程: ~* m //...

    MFC 多线程总结

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

Global site tag (gtag.js) - Google Analytics