java线程

public class ThreadDemo extends Thread {
	/*
	 * 学习多线程之前,我们先要了解几个关于多线程有关的概念。
		A:进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,
		即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
		
		B:线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。
		一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
		
		C:简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程
		什么是多线程呢?即就是一个程序中有多个线程在同时执行。
	 */
	
	/*
	 * 多线程的实现方式:
	 * 		方式1:一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例
	 * 
	 * Thread
	 * 		String getName()      返回该线程的名称。 
	 * 		void   setName(String name) 改变线程名称,使之与参数 name 相同。
	 * 
	 * 
	 * CPU执行程序的随机性
	 */
	public static void main(String[] args) {
        ThreadDemo threadDemo=new ThreadDemo();
        threadDemo.setName("线程一");//设置线程的名字
        threadDemo.start();
        ThreadDemo mtDemo=new ThreadDemo();
        mtDemo.setName("线程二");
        mtDemo.start();
	}
	
	public void run() {//start()启动线程程序
		for(int i=0;i<10;i++)
		{
			System.out.println(getName()+" "+i);
		}
		
	}
}

  

import java.util.concurrent.ConcurrentLinkedDeque;

/*
 * 实现线程二:实现Runnable接口
	创建线程的另一种方法是声明实现 Runnable 接口的类。
	该类然后实现 run 方法。然后创建Runnable的子类对象,
	传入到某个线程的构造方法中,开启线程。


	为何要实现Runnable接口,Runable是啥玩意呢?继续API搜索。
             查看Runnable接口说明文档:Runnable接口用来指定每个线程要执行的任务。
             包含了一个 run 的无参数抽象方法,需要由接口实现类重写该方法。
 */
public class ThreadDemo2 implements Runnable {

	@Override
	public void run() {
		for(int i=0;i<10;i++)
		{
			System.out.println(Thread.currentThread().getName()+" "+i);
		}
		
	}
	public static void main(String[] args) {
		ThreadDemo2 threadDemo2=new ThreadDemo2();
		Thread t=new Thread(threadDemo2);
		Thread thread=new Thread(threadDemo2);
		t.setName("线程一");
		thread.setName("线程二");
		t.start();
		thread.start();
	}
 
}

  

窗口售票

public class TicktetTest implements Runnable {
	int tickets=100;
	int all=0;
	public static void main(String[] args) {
		TicktetTest ticktetTest=new TicktetTest();
		Thread t1=new Thread(ticktetTest);
		t1.setName("窗口一:");
		Thread t2=new Thread(ticktetTest);
		t2.setName("窗口二");
		Thread t3=new Thread(ticktetTest);
		t3.setName("窗口三");
		t1.start();
		t2.start();
		t3.start();
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			if(tickets>0) {
				System.out.println(Thread.currentThread().getName()+" "+"售出一张车票"+--tickets);
			}
			else {
				System.out.println(Thread.currentThread().getName()+":售票结束");
				break;
			}
		}
		
	}
}

  

public class TicktetTest implements Runnable {
	int tickets=100;
	Object obj=new Object();
	int all=0;
	public static void main(String[] args) {
		TicktetTest ticktetTest=new TicktetTest();
		Thread t1=new Thread(ticktetTest);
		t1.setName("窗口一:");
		Thread t2=new Thread(ticktetTest);
		t2.setName("窗口二");
		Thread t3=new Thread(ticktetTest);
		t3.setName("窗口三");
		t1.start();
		t2.start();
		t3.start();
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			/*
			 * 同步方法:使用关键字synchronized修饰的方法,一旦被一个线程访问,则整个方法全部锁住,其他线程则无法访问
			 * 
			 * synchronized
			 * 注意:
			 * 		非静态同步方法的锁对象是this
			 * 		静态的同步方法的锁对象是当前类的字节码对象
			 */
			synchronized (obj) {//同步安全性高,效率低。
				if(tickets>0) {
					System.out.println(Thread.currentThread().getName()+" "+"售出一张车票"+--tickets);
				}
				else {
					System.out.println(Thread.currentThread().getName()+":售票结束");
					break;
				}
			}
			
		}
		
	}
}

  

一纸高中万里风,寒窗读破华堂空。 莫道长安花看尽,由来枝叶几相同?
原文地址:https://www.cnblogs.com/byczyz/p/11141410.html