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();
}
}
实现类:
一道关于多线程的面试题
★多窗口卖票
多线程互斥共享“基本数据类型数据”资源
第一个版本(80分)--缺点:没有实现窗口的编号问题
实现类:
第二个版本(100分)
实现类:
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(); } }
相关文章推荐
- Java 多线程:Lock 关键字
- java中的垃圾回收
- java Scanner用法
- Java 多线程:分析线程池的实现原理
- Java JDBC 之 URL 与数据库连接
- Java 多线程:生产者消费者模型
- Java 多线程:synchronized 多线程同步关键字
- Java 多线程:AtomicInteger源码分析——基于CAS的乐观锁实现
- 用 Eclipse 插件提高JAVA 代码质量
- Java 多线程:Condition 多线程同步关键字
- java学习总结
- java 内部类使用
- Struts2 拦截器(Interceptor )原理和配置
- 关于spring、pringmvc整合时注解扫描
- Myeclipse 设置背景样式
- Java代码后台使用dip值设置width,heigth等
- java log4j日志教程
- java 基础知识
- myeclipse中mybatis generator插件的手动安装即使用
- Spring Boot实战之配置使用Logback进行日志记录