Java多线程编程-实现方式-实现runnable 售票 线程同步

涎涎原创约 865 字大约 3 分钟...JavaJava

241-Java多线程编程-实现方式-_实现runnable & 售票 & 线程同步.mdopen in new window

注意

本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。

概念

示例代码

package com.tencent.chapter04.两种实现方式;

public class TestRunnable {

	public static void main(String[] args) {
		/**
		 * 测试继承Thread
		 */
		//线程一
		//ThreadDemo t1 = new ThreadDemo();
		//t1.run();//此时为单线程,仅为调用一个类的普通方法而已
		//t1.start();//启动线程,让线程就绪,但是不会立马执行run方法,等待CPU分配时间片
		
		//线程二
		//ThreadDemo t2 = new ThreadDemo();
		//t2.start();//启动线程,让线程就绪,但是不会立马执行run方法,等待CPU分配时间片

		/**
		 * 测试实现Runnable
		 */
		RunableDemo runableDemo = new RunableDemo();
		//t3.start();//没有start()方法,不能启动一个线程
		
		//线程三
		Thread t3 = new Thread(runableDemo);
		t3.start();
		
		//线程四
		Thread t4 = new Thread(runableDemo);
		t4.start();
		
		//主线程
		for (int i = 1; i <= 5; i++) {
			System.out.println(Thread.currentThread().getName() + " : " + i);
		}
	}
}
package com.tencent.chapter04.售票;

/**
 * 线程同步:使用synchronized关键字修饰
		
		1.同步方法:使用synchronized修饰方法
				//同步方法,粒度粗
				public synchronized void run() {
					
				}
		
			类锁:synchronized修饰static的方法,例如:
					public static synchronized void run() {},基于当前类,一次只能被一个线程访问
					
		            对象锁:synchronized修饰非static的方法,例如:
		            public synchronized void run() {},基于当前对象,一次只能被一个线程访问
		            
		2.同步语句:使用synchronized修饰代码块
			   //同步语句,粒度细
			   synchronized (this) {
			   
			   }
			   
			 类锁(RunnableTicket.class)、对象锁(this)、任意锁("a","b")
 */
public class RunnableTicket implements Runnable{

	private int num = 50;

	//同步语句,粒度细
	@Override
	public void run() {
		while(num > 0)
		{
			// 1   杰成     2 国威---------------排队
			synchronized (this) {
				//加一层判断,判断当前是否还有余票
				if(num > 0)
				{
					System.out.println("售票员 【" + Thread.currentThread().getName() + "】,售出了票NO." + num);
					num--;
				}
			}
			
			//Thread休眠一秒
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	//同步方法,粒度粗
	//@Override
	public synchronized void run1() {
		while(num > 0)
		{
			System.out.println("售票员 【" + Thread.currentThread().getName() + "】,售出了票NO." + num);
			num--;
		}
	}
}
package com.tencent.chapter04.售票;

public class ThreadTicket extends Thread{

	private int num = 50;

	@Override
	public void run() {
		while(num > 0)
		{
			System.out.println("售票员 【" + Thread.currentThread().getName() + "】,售出了票NO." + num);
			num--;
		}
	}
}
package com.tencent.chapter04.售票;

public class TicketTest {

	public static void main(String[] args) {
		/**
		 * 继承Thread:不能实现数据共享,因为每new一次对象,生成一个新的num保存在堆内存中,且只能单继承
		 */
		/*//售票员一号
		ThreadTicket t1 = new ThreadTicket();
		t1.setName("杨国");
		t1.start();
		
		//售票员二号
		ThreadTicket t2 = new ThreadTicket();
		t2.setName("陆嘉琛");
		t2.start();*/
		
		/**
		 * 实现Runnable接口:可以共享数据,RunnableTicket仅new一次,num在内存中仅存在一份,共享给t3与t4一起使用,支持多实现
		 */
		RunnableTicket ticket = new RunnableTicket();
		
		//售票员三号
		Thread t3 = new Thread(ticket);
		t3.setName("杰成");
		t3.start();
		
		//售票员四号
		Thread t4 = new Thread(ticket);
		t4.setName("国威");
		t4.start();
		
		RunnableTicket ticket2 = new RunnableTicket();
		
		//售票员三号
		Thread t5 = new Thread(ticket2);
		t5.setName("杰成2");
		t5.start();
		
		//售票员四号
		Thread t6 = new Thread(ticket2);
		t6.setName("国威2");
		t6.start();
		
		
	}

}

分割线


相关信息

以上就是我关于 Java多线程编程-实现方式-_实现runnable & 售票 & 线程同步 知识点的整理与总结的全部内容,希望对你有帮助。。。。。。。

上次编辑于:
贡献者: 涎涎
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.4