04747_Java语言程序设计(一)_第8章_多线程
例8.1应用程序用Thread子类实现多线程。
import java.util.Date;
public class Example8_1 {
static Athread threadA;
static Bthread threadB;
public static void main(String args[]) {
threadA = new Athread();
threadB = new Bthread();
threadA.start();
threadB.start();
}
}
class Athread extends Thread {
public void run() {
Date timeNow;// 为了能输出当时的时间
for (int i = 0; i <= 5; i++) {
timeNow = new Date();// 得到当前时间
System.out.println("我是threadA:" + timeNow.toString());
try {
sleep(2000);
} catch (InterruptedException e) {
}
}
}
}
class Bthread extends Thread {
public void run() {
Date timeNow;
for (int i = 0; i <= 5; i++) {
timeNow = new Date();
System.out.println("我是threadB:" + timeNow.toString());
try {
sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
例8.2小应用程序通过Runnable接口创建线程。
import java.applet.*;
import java.awt.*;
import javax.swing.*; public class Example8_2 extends java.applet.Applet implements Runnable {// 实现Runnable接口
Thread myThread = null;// 声明线程对象
JTextArea t;
int k; public void start() {
t = new JTextArea(20, 20);
add(t);
k = 0;
setSize(500, 400);
if (myThread == null)// 重新进入小程序时,再次创建线程myThread
{
myThread = new Thread(this);// 创建新线程
myThread.start();// 启动新线程
}
} public void run()// 定义线程的运行代码
{
while (myThread != null) {
try {
myThread.sleep(1000);
k++;
} catch (InterruptedException e) {
}
repaint();
}
} public void paint(Graphics g) {
double i = Math.random();
if (i < 0.5) {
g.setColor(Color.yellow);
} else {
g.setColor(Color.blue);
}
g.fillOval(10, 10, (int) (100 * i), (int) (100 * i));
t.append("我在工作,已休息了" + k + "次\n");
} public void stop()// 离开小程序页时,调用本方法,让线程停止
{
if (myThread != null) {
myThread.stop();
myThread = null;// 重新进入小程序页时,再次创建线程myThread
}
}
}
例8.3小应用程序创建两个线程,一个顺时针画图,另一个逆时针画图。
import java.applet.*;
import java.awt.*;
import java.awt.event.*; public class Example8_3 extends java.applet.Applet implements Runnable {
Thread redBall, blueBall;
Graphics redPen, bulePen;
int blueSeta = 0, redSeta = 0; public void init() {
setSize(250, 200);
redBall = new Thread(this);
blueBall = new Thread(this);
redPen = getGraphics();
bulePen = getGraphics();
redPen.setColor(Color.red);
bulePen.setColor(Color.blue);
setBackground(Color.gray);
} public void start() {
redBall.start();
blueBall.start();
} public void run() {
int x, y;
while (true) {
if (Thread.currentThread() == redBall) {
x = (int) (80.0 * Math.cos(3.1415926 / 180.0 * redSeta));
y = (int) (80.0 * Math.sin(3.1415926 / 180.0 * redSeta));
redPen.setColor(Color.gray);// 用底色画图,擦除原先所画圆点
redPen.fillOval(100 + x, 100 + y, 10, 10);
redSeta += 3;
if (redSeta >= 360) {
redSeta = 0;
}
x = (int) (80.0 * Math.cos(3.1415926 / 180.0 * redSeta));
y = (int) (80.0 * Math.sin(3.1415926 / 180.0 * redSeta));
redPen.setColor(Color.red);
redPen.fillOval(100 + x, 100 + y, 10, 10);
try {
redBall.sleep(20);
} catch (InterruptedException e) {
}
} else if (Thread.currentThread() == blueBall) {
x = (int) (80.0 * Math.cos(3.1415926 / 180.0 * blueSeta));
y = (int) (80.0 * Math.sin(3.1415926 / 180.0 * blueSeta));
bulePen.setColor(Color.gray);
bulePen.fillOval(150 + x, 100 + y, 10, 10);
blueSeta -= 3;
if (blueSeta <= -360) {
blueSeta = 0;
}
x = (int) (80.0 * Math.cos(3.1415926 / 180.0 * blueSeta));
y = (int) (80.0 * Math.sin(3.1415926 / 180.0 * blueSeta));
bulePen.setColor(Color.blue);
bulePen.fillOval(150 + x, 100 + y, 10, 10);
try {
blueBall.sleep(40);
} catch (InterruptedException e) {
}
}
}
}
}
例8.4应用程序说明多线程共享变量,因没有互相协调产生不正确结果。
public class Example8_4 {
public static void main(String args[]) {
MyResourceClass mrc = new MyResourceClass();
Thread[] aThreadArray = new Thread[20];
System.out.println("\t刚开始的值是:" + mrc.getInfo());
// 20个线程*每个线程加1000次*每次加50
System.out.println("\t预期的正确结果是:" + 20 * 1000 * 50);
System.out.println("\t多个线程正在工作,请稍等!");
for (int i = 0; i < 20; i++)// 产生20个线程并开始执行
{
aThreadArray[i] = new Thread(new MyMultiThreadClass(mrc));
aThreadArray[i].start();
}
WhileLoop: // 等待所有线程结束
while (true) {
for (int i = 0; i < 20; i++) {
if (aThreadArray[i].isAlive()) {
continue WhileLoop;
}
}
break;
}
System.out.println("\t最后的结果是:" + mrc.getInfo());
}
}
class MyMultiThreadClass implements Runnable {
MyResourceClass UseInteger;
MyMultiThreadClass(MyResourceClass mrc) {
UseInteger = mrc;
}
public void run() {
int i, LocalInteger;
for (i = 0; i < 1000; i++) {
LocalInteger = UseInteger.getInfo();// 把值取出来
LocalInteger += 50;
try {
Thread.sleep(10);// 做一些其他的处理
} catch (InterruptedException e) {
}
UseInteger.putInfo(LocalInteger);// 把值存出来
}
}
}
class MyResourceClass {
int IntegerResource;
MyResourceClass() {
IntegerResource = 0;
}
public int getInfo() {
return IntegerResource;
}
public void putInfo(int info) {
IntegerResource = info;
}
}
例8.5小应用程序模拟一群顾客购买纪念品。
class SalesLady {
int memontoes, five, ten;// 销售员纪念品数,5、10元张数
public synchronized String ruleForSale(int num, int money) {
// 购买过程为临界段
String s = null;
if (memontoes == 0) {
return "对不起,已售完!";
}
if (money == 5) {
memontoes--;
five++;
s = "给你一个纪念品," + "你的钱正好。";// 销售员的回答
} else if (money == 10) {
while (five < 1) {
try {
System.out.println("" + num + "号顾客用10元钱购票,发生等待!");
wait();
} catch (InterruptedException e) {
}
}
memontoes--;
five -= 1;
ten++;
s = "给你一个纪念品," + "你给了十元,找你五元。";
}
notify();// 通知后面等待的顾客
return s;
}
SalesLady(int m, int f, int t) {
memontoes = m;
five = f;
ten = t;
}
}
public class Example8_5 extends java.applet.Applet {
static SalesLady salesLady = new SalesLady(14, 0, 0);
public void start() {
int moneies[] = { 10, 10, 5, 10, 5, 10, 5, 5, 10, 5, 10, 5, 5, 10, 5 };
Thread[] aThreadArray = new Thread[20];
System.out.println("现在开始购票:");
for (int i = 0; i < moneies.length; i++)// 产生20个线程并开始执行
{
aThreadArray[i] = new Thread(new CustomerClass(i + 1, moneies[i]));
aThreadArray[i].start();
}
WhileLoop: // 等待所有线程结束
while (true) {
for (int i = 0; i < moneies.length; i++) {
if (aThreadArray[i].isAlive()) {
continue WhileLoop;
}
}
break;
}
System.out.println("购票结束");
}
}
class CustomerClass implements Runnable {
int num, money;// 顾客序号,钱的面值
public void run() {
try {
Thread.sleep(10);
} // 假定顾客在购买前还做一些其他的事
catch (InterruptedException e) {
}
System.out.println("我是" + num + "号顾客,用" + money + "元购纪念品,售货员说:" + Example8_5.salesLady.ruleForSale(num, money));
}
CustomerClass(int n, int m) {
num = n;
money = m;
}// 顾客构造方法
}
04747_Java语言程序设计(一)_第8章_多线程的更多相关文章
- ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 使用ArcGIS进行空间分析 1.1 GIS分析基础 G ...
- ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Deskto ...
- ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一 ...
- 04747_Java语言程序设计(一)_第3章_面向对象编程基础
链式编程 每次调用方法后,返回的是一个对象 /* * 链式编程 * 每次调用方法后,返回的是一个对象 */ class Student { public void study() { System.o ...
- 04747_Java语言程序设计(一)_第1章_Java语言基础
二进制0b开头 八进制0开头 十六进制0x开头 package com.jacky; public class Aserver { public static void main(String arg ...
- 04747_Java语言程序设计(一)_第10章_网络与数据库编程基础
例10.1说明InetAddress类的用法的应用程序. public class Example10_1 { public static void main(String args[]) { try ...
- 04747_Java语言程序设计(一)_第9章_输入和输出流
例9.1一个文件复制应用程序,将某个文件的内容全部复制到另一个文件. import java.io.*; public class Example9_1 { public static void ma ...
- 04747_Java语言程序设计(一)_第7章_图形、图像与多媒体
例7.1小应用程序用6种字型显示字符串,显示内容说明本身的字型. import java.applet.*; import java.awt.*; public class Example7_1 ex ...
- 04747_Java语言程序设计(一)_第6章_图形界面设计(二)
例6.1声明一个面板子类,面板子类对象有3个选择框. class Panel1 extends JPanel { JCheckBox box1, box2, box3; Panel1() { box1 ...
随机推荐
- 【转】AAC ADTS格式分析
1.ADTS是个啥 ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式. 记得第一次做demux的时候,把AAC音频的ES流从FLV封装格式中抽 ...
- 手动同步chrome浏览器
chrome浏览器每次设置好的标签在重新开机后都会变回设置前的状态,崩溃,每次设置好后还是手动同步一下吧. 1. 点击 工具(右上角的三个点)-->设置 2. 点击 高级同步设置 3. 点击 使 ...
- C++类的继承实例
首先由三个类分别为DateType(日期类).TimeType(时间类).DateTimeType(日期时间内).详细代码例如以下: #include <iostream> using n ...
- Verilog 读写文件
Verilog 读写文件 在数字设计验证中,有时我们需要大量的数据,这时可以通过文件输入,有时我们需要保存数据,可以通过写文件保存. 读写文件testbench module file_rw_tb() ...
- avalon学习笔记一 列表及条件过滤
好长时间都没有更新博客了,不是因为没有学习新的东西,而是到了新的单位每天玩命加班实在是太累了!经过一年的努力吧,终于可以轻松一下了.废话少说,直接干货吧! 由于是学习阶段,就直接拿了公司的二级页面做了 ...
- 集合运算符之全集、交集、补集【weber出品必属精品】
集合的概念 与数学中的全集.交集.补集的概念是一样的 常用的集合运算符 集合运算符的作用:把两个查询构造为一个联合查询 1. 全集:求连个查询的全集 union all:将两个查询的所有数据全部列出, ...
- hdu 油菜花王国
Problem Description 程序设计竞赛即将到来,作为学校ACM集训队主力,小明训练一直很努力.今天天气不错,教练也心情大好,破例给各位队员放假一天,小明就骑着自己的小电驴到郊外踏青去了. ...
- C#界面设计疑问2:panel摆放问题
1.问题1是这样的,网友意思让使用一个按键对应显示一个panel 即,http://zhidao.baidu.com/question/1924974374730559427.html 2.那么我在设 ...
- [QT]QT概述
QT概述 基于C++的GUI开发框架,跨平台.Qt 是一个用于桌面系统和嵌入式开发的跨平台应用程序框架. QT是挪威TROLLTECH公司开发的跨平台C++工具,在UNIX下非常出名:他的宗旨是“一次 ...
- OpenRisc-39-ORPSoC,or1200的memory hierarchy整体分析
引言 前面我们简单分析了ORPSoC的整体结构,or1200_top的整体结构,or1200_cpu的整体结构. 并对ORPSoC的启动过程,ORPSoC的debug子系统,clock子系统进行了介绍 ...