重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
稍微修改下 未测试
为利辛等地区用户提供了全套网页设计制作服务,及利辛网站建设行业解决方案。主营业务为做网站、网站制作、利辛网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
package com.leejiliang.HomeworkDemo2;
/**
* 定义打印输出类,定义两个数据输出方法,分别用于输出偶数和奇数
*
* @author Administrator even偶数 uneven奇数
*/
class PrintNumber {
boolean isEven = true;
public void printEven() {
for (int i = 0; i = 100; i = i + 2) {
if (i % 2 == 0) {
synchronized (this) {
while (!isEven) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("偶数:" + i);
isEven = false;
this.notify();
}
}
}
}
// 输出1到100之间的奇数
public void printUnEven() {
for (int i = 1; i = 99; i = i + 1) {
if (i % 2 != 0) {
synchronized (this) {
while (isEven) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("奇数:" + i);
isEven = true;
this.notify();
}
}
}
}
}
/**
*
* @author Administrator 定义输出偶数的线程类
*/
class ThreadForEven implements Runnable {
private PrintNumber pn = null;
public ThreadForEven(PrintNumber pn) {
this.pn = pn;
}
@Override
public void run() {
pn.printEven();
}
}
/**
* 定义输出奇数的线程类
*
* @author Administrator
*
*/
class ThreadForUneven implements Runnable {
private PrintNumber pn = null;
public ThreadForUneven(PrintNumber pn) {
this.pn = pn;
}
@Override
public void run() {
pn.printUnEven();
}
}
// 主函数,执行两个线程
class ZeroToOneHundred {
public static void main(String[] args) {
PrintNumber pn = new PrintNumber();
ThreadForEven te = new ThreadForEven(pn);
ThreadForUneven tu = new ThreadForUneven(pn);
Thread threadeven = new Thread(te);
Thread threaduneven = new Thread(tu);
threadeven.start();
threaduneven.start();
}
}
首先说用M定义的线程,这里M相当于继承线程方法的类,在这个类里给它定义了线程方法。当在public方法里创建M的实例时,类M中的方法也被实例化了,所以当用t.start();启动线程时,是启动的M中的线程。再说for中的,和上边完全相反,这个线程只是开启了线程,并没有定义其它方法,当程序运行时能和上边程序同时运行,所以都是1,这是for循环的结果
首先,你同步的是具体的某个Test实例, 对于那个实例来说,实际上只有一个线程访问了那个代码块,但是sum和other却是多个线程同时去进行访问,实际上这是不安全的,如果你想实现每次都输出10000的效果,那么正确的应该是在Test.class上加锁,而不是获取Test实例的锁,修改后的代码如下:
public class Test extends Thread {
public static int sum = 10000;
public static int other = 0;
public void getMoney() {
synchronized (Test.class) {
System.out.println(Thread.currentThread().getName() + " 开始执行");
sum = sum - 100;
System.out.println("sum-100");
other = other + 100;
System.out.println("other+100");
System.out.println(sum + other);
System.out.println(Thread.currentThread().getName() + " 执行完成");
}
}
public void run() {
getMoney();
}
public static void main(String[] agrs) {
Thread t[] = new Thread[10];
for (int i = 0; i = 9; i++) {
t[i] = new Test();
t[i].start();
}
}
}
// 上面代码能得到你的结果