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;
}
}
}
}
}
一纸高中万里风,寒窗读破华堂空。
莫道长安花看尽,由来枝叶几相同?

浙公网安备 33010602011771号