您的位置:首页 > 编程语言 > Java开发

Java---多线程(1)

2016-08-05 17:22 549 查看
多线程的基础入门(奇偶线程的实现--创建两个线程:一个输出奇数,一个输出偶数)

package ThreadRecover.demo1;

//多线程最关键的步骤,覆盖run()方法
//多线程的回顾和复习之前的----输出奇偶数(两个线程)
//多线程第一个版本的写法(继承Thread类)
public class MyThreadDemo1 extends Thread {
private int first; //构造传参
public MyThreadDemo1(int first){
this.first = first;
}
@Override
public void run() {
for(int i=first;i<=100;i+=2){
System.out.print(i+" ");
}
System.out.println();
}
}


package ThreadRecover.demo2;

//多线程的第二个版本实现
//实现Runnable接口,关键步骤,覆盖父类的run()方法
public class MyThreadDemo2 implements Runnable {
private int first;
public MyThreadDemo2(int first){
this.first = first;
}
@Override
public void run() {
for(int i=first;i<=100;i+=2){
System.out.print(i+" ");
}
System.out.println();
}
}

实现类:

package ThreadRecover;

import ThreadRecover.demo2.MyThreadDemo2;

public class Client {
// 线程启动start()方法
public static void main(String[] args) {
MyThreadDemo1 mt1 = new MyThreadDemo1(1); //奇数线程
mt1.start();
MyThreadDemo1 mt2 = new MyThreadDemo1(2); //偶数线程
mt2.start();
MyThreadDemo2 target = new MyThreadDemo2(1);
Thread t1 = new Thread(target);
t1.start();
MyThreadDemo2 target2 = new MyThreadDemo2(2);
Thread t2 = new Thread(target2);
t2.start();
}
}


一道关于多线程的面试题
★多窗口卖票

      多线程互斥共享“基本数据类型数据”资源

第一个版本(80分)--缺点:没有实现窗口的编号问题

package 面试题_窗口售票.v1;

//车站售票问题----面试题
//要解决共享数据问题---首先想到对象锁(关键---锁的对象是什么)
//共享数据:静态和非静态(静态--平行对象--(private Object obj = new Object()))
//非静态--直接调用对象this即可
public class ticketWindow implements Runnable {
private int num=200;     //假如某车站售此趟车票总数为200张--非静态
private String name = null;
//构造传参
public ticketWindow(String name){
this.name = name;
}
@Override
public void run() {
while(true){
synchronized (this) {   //上对象锁(num)
if (num > 0) {
System.out.println(name + ":" + num); //name为某个窗口的编号
num--;
} else {
break;
}
}    //解锁---还锁
}
}
}

实现类:

package 面试题_窗口售票.v1;

import 面试题_窗口售票.v1.ticketWindow;

public class Client {

public static void main(String[] args) {
ticketWindow tw1 = new ticketWindow("窗口1"); // 同一个对象共用一块模板
Thread t1 = new Thread(tw1);
t1.start();
Thread t2 = new Thread(tw1);
t2.start();
Thread t3 = new Thread(tw1);
t3.start();
Thread t4 = new Thread(tw1);
t4.start();
}
}

第二个版本(100分)

package 面试题_窗口售票.v2;

public class ticketWindow implements Runnable {
private static int num = 200;  //在这里共享数据是基本数据类型,然而对象锁的对象是对象类型,所以这里应该添加一个平行对象来获得该共享数据
private Object obj = new Object();
private String name = null;
//通过构造传参的方法把窗口编号传上去
public ticketWindow(String name){
this.name = name;
}
@Override
//覆盖父类方法
public void run() {
while(true){
synchronized (obj) {    //上锁
if (num > 0) {
System.out.println(name + ":" + num--);
}
}    //解锁--还锁
}
}
}

实现类:
package 面试题_窗口售票.v2;

public class Client {

public static void main(String[] args) {
//在这里要实现数据(售票数)共享----首先应该想到的是静态(存在类模板中)
Thread t1 = new Thread(new ticketWindow("窗口1"));
t1.start();
Thread t2 = new Thread(new ticketWindow("窗口2"));
t2.start();
Thread t3 = new Thread(new ticketWindow("窗口3"));
t3.start();
Thread t4 = new Thread(new ticketWindow("窗口4"));
t4.start();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: