public class MultiThreadShareData {
/**
* 多线程成共享数据 面试题: 第一种:买票系统 方法:
* 方式1:如果每个线程执行相同的代码,可以使用同一个Runable对象,这个Runable对象中有那个共享的数据
*/
public static void main(String[] args) {
ShareData1 data = new ShareData1();
new Thread(data).start();
new Thread(data).start();
}
}
class ShareData1 implements Runnable{
private int count =100;
@Override
public void run() {
while(true){
count --;
}
}
}
××××××××××××××××××××××××××××××××××××××××××××
public class MultiThreadShareData2 {
/**
* 多线程成共享数据(共享数据是指同一个对象)
* 面试题:
* 第二种方式:如果比如多个个线程执行代码不同比如以下示例一会加,一会减;测需要2个Runable 对象来操作;
设计4个线程,其中2个线程每次对j增加1,另外两个线程对J 每次减少1.写出程序;
*/
public static void main(String[] args) {
//共同对象
final ShareData data = new ShareData();
/* 加 j */
new Thread(new Runnable(){//内部类
@Override
public void run() {
data.sub();
}
}).start();
/* 减 j */
new Thread(new Runnable(){
@Override
public void run() {
data.add();
}
}).start();
}
}
class ShareData {
private int j=0;
public synchronized void add(){
j++;
}
public synchronized void sub(){
j--;
}
}
demo3: 网上搜索的答案
/**
* 第二种方式:如果比如多个个线程执行代码不同比如以下示例一会加,一会减;测需要 2个Runable 对象来操作;
设计4个线程,其中2个线程每次对j增加1,另外两个线程对J 每次减少1.写出程序;
* @author Administrator
* 这里2个Runnable都是内部类,可以访问外部类的成员变量 这里是 j ,通过内部类调用外部类方法 J++ ,J --
*/
public class ThreadTest1 {
private int j;
public static void main(String args[]) {
ThreadTest1 tt = new ThreadTest1();
//必须通过外部类的对象才能实例化内部类
Inc inc = tt.new Inc();
Dec dec = tt.new Dec();
for (int i = 0; i < 2; i++) {
Thread t = new Thread(inc);
t.start();
t = new Thread(dec);
t.start();
}
}
private synchronized void inc() {
j++;
System.out.println(Thread.currentThread().getName() + "-inc:" + j);
}
private synchronized void dec() {
j--;
System.out.println(Thread.currentThread().getName() + "-dec:" + j);
}
//内部类 增
class Inc implements Runnable {
// 可以操作外部类的变量 j
public void run() {
for (int i = 0; i < 2; i++) {
inc();
}
}
}
//内部类 减
class Dec implements Runnable {
// 可以操作外部类的变量 j
public void run() {
for (int i = 0; i < 2; i++) {
dec();
}
}
}
}
阅读(144) | 评论(0) | 转发(0) |