Ⅰ java 怎么创建一个新的进程
不能创建进程,只能创建线程
在Java中,类仅支持单继承,也就是说,当定义一个新的类的时候,它只能扩展一个外部类.这样,如果创建自定义线程类的时候是通过扩展 Thread类的方法来实现的,那么这个自定义类就不能再去扩展其他的类,也就无法实现更加复杂的功能。因此,如果自定义类必须扩展其他的类,那么就可以使用实现Runnable接口的方法来定义该类为线程类,这样就可以避免Java单继承所带来的局限性。
还有一点最重要的就是使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享.
(1)通过扩展Thread类来创建多线程
假设一个影院有三个售票口,分别用于向儿童、成人和老人售票。影院为每个窗口放有100张电影票,分别是儿童票、成人票和老人票。三个窗口需要同时卖票,而现在只有一个售票员,这个售票员就相当于一个CPU,三个窗口就相当于三个线程。通过程序来看一看是如何创建这三个线程的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   
<span style="font-size: 16px;">public class MutliThreadDemo {
    public static void main(String [] args){
        MutliThread m1=new MutliThread("Window 1");
        MutliThread m2=new MutliThread("Window 2");
        MutliThread m3=new MutliThread("Window 3");
        m1.start();
        m2.start();
        m3.start();
    }
}
class MutliThread extends Thread{
    private int ticket=100;//每个线程都拥有100张票
    MutliThread(String name){
        super(name);//调用父类带参数的构造方法
    }
    public void run(){
        while(ticket>0){
            System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
        }
    }
}
</span>
程序中定义一个线程类,它扩展了Thread类。利用扩展的线程类在MutliThreadDemo类的主方法中创建了三个线程对象,并通过start()方法分别将它们启动。
从结果可以看到,每个线程分别对应100张电影票,之间并无任何关系,这就说明每个线程之间是平等的,没有优先级关系,因此都有机会得到CPU的处理。但是结果显示这三个线程并不是依次交替执行,而是在三个线程同时被执行的情况下,有的线程被分配时间片的机会多,票被提前卖完,而有的线程被分配时间片的机会比较少,票迟一些卖完。
可见,利用扩展Thread类创建的多个线程,虽然执行的是相同的代码,但彼此相互独立,且各自拥有自己的资源,互不干扰。
(2)通过实现Runnable接口来创建多线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
   
<span style="font-size: 16px;">public class MutliThreadDemo2 {
    public static void main(String [] args){
        MutliThread m1=new MutliThread("Window 1");
        MutliThread m2=new MutliThread("Window 2");
        MutliThread m3=new MutliThread("Window 3");
        Thread t1=new Thread(m1);
        Thread t2=new Thread(m2);
        Thread t3=new Thread(m3);
        t1.start();
        t2.start();
        t3.start();
    }
}
class MutliThread implements Runnable{
    private int ticket=100;//每个线程都拥有100张票
    private String name;
    MutliThread(String name){
        this.name=name;
    }
    public void run(){
        while(ticket>0){
            System.out.println(ticket--+" is saled by "+name);
        }
    }
}
</span>
由于这三个线程也是彼此独立,各自拥有自己的资源,即100张电影票,因此程序输出的结果和(1)结果大同小异。均是各自线程对自己的100张票进行单独的处理,互不影响。
可见,只要现实的情况要求保证新建线程彼此相互独立,各自拥有资源,且互不干扰,采用哪个方式来创建多线程都是可以的。因为这两种方式创建的多线程程序能够实现相同的功能。
 
由于这三个线程也是彼此独立,各自拥有自己的资源,即100张电影票,因此程序输出的结果和例4.2.1的结果大同小异。均是各自线程对自己的100张票进行单独的处理,互不影响。
可见,只要现实的情况要求保证新建线程彼此相互独立,各自拥有资源,且互不干扰,采用哪个方式来创建多线程都是可以的。因为这两种方式创建的多线程程序能够实现相同的功能。
(3)通过实现Runnable接口来实现线程间的资源共享
 现实中也存在这样的情况,比如模拟一个火车站的售票系统,假如当日从A地发往B地的火车票只有100张,且允许所有窗口卖这100张票,那么每一个窗口也相当于一个线程,但是这时和前面的例子不同之处就在于所有线程处理的资源是同一个资源,即100张车票。如果还用前面的方式来创建线程显然是无法实现的,这种情况该怎样处理呢?看下面这个程序,程序代码如下所示:
 
+ View Code
 结果正如前面分析的那样,程序在内存中仅创建了一个资源,而新建的三个线程都是基于访问这同一资源的,并且由于每个线程上所运行的是相同的代码,因此它们执行的功能也是相同的。
可见,如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。而这一功能通过扩展Thread类是无法实现的,读者想想看,为什么?
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。
Ⅱ JAVA 多线程,模拟售票窗口出售电影票,假设有100张电影票,有3个售票站,模拟各个售票站的售票情况
主要要注意对票数量的同步控制,售出的时候同步方法,别的就跟普通多线程没什么区别
Ⅲ javaEE编程,项目用的是SSH三大框架,做的是购票系统,比如是电影票,如何处理多个人选择多一张票的现象
选好座位提交后修改该座位状态。 后面的人在选同样一个后提交就提示已卖出,然后刷新页面
Ⅳ 电影票上数字编号不同怎么实现的
采用多线程方式。
达到多个线程运行同一个售票对象保证每个票只被售卖一次。
根据电影票上的作为号,对号入座即可。座位号一般都在座椅的靠背上,或者其他电影院的座号也会出现在扶手上,请仔细观察。
Ⅳ java多线程的同步控制与线程间的通信
按照下面这个运行结果(最后两行顺序不一定):
小张 用 20 元买票
小孙 用 10 元买票
小孙 买到票并拿回 5 元
小赵 用 5 元买票
小赵 买到票并拿回 0 元
小张 买到票并拿回 15 元
public class Main {
    
    public static void main(String[] args) {
        try {
            TicketSeller ts = new TicketSeller();
            // 张某拿着1张20元的人民币排在第一,孙某拿着1张10元的人民币排在第二,赵某拿着1张5元的人民币排在第三。
            TicketBuyer zhang = new TicketBuyer(ts, "小张", 20);
            Thread tZhang = new Thread(zhang);
            tZhang.start();
            Thread.sleep(100); // 确保买票顺序
            TicketBuyer sun = new TicketBuyer(ts, "小孙", 10);
            Thread tSun = new Thread(sun);
            tSun.start();
            Thread.sleep(100);
            TicketBuyer zhao = new TicketBuyer(ts, "小赵", 5);
            Thread tZhao = new Thread(zhao);
            tZhao.start();
        } catch (InterruptedException ex) {
            
        }
    }
}
class TicketSeller{
    //电影票5元一张
    private static final int TICKET_PRICE = 5;
    
    private int fiveNumber, tenNumber, twentyNumber;
        
    public TicketSeller(){
        //售票员只有1张5元的钱
        fiveNumber = 1;
        tenNumber = twentyNumber = 0;
    }
    public synchronized int sellTicket(int receiveMoney){
        int changeRequired = receiveMoney - TICKET_PRICE;
        while(!prepareChange(changeRequired)){
            try {                
                this.wait();
            } catch (InterruptedException ex) {
                // Do nothing
            }
        }
        switch(receiveMoney){
            case 5: fiveNumber++; break;
            case 10: tenNumber++; break;
            case 20: twentyNumber++; break;
            default: System.out.println("错误001");
        }
        this.notify();
        
        return changeRequired;
    }
    /**
     * 给出找钱
     * @param changeRequired 需要找的钱数
     * @return 是否能给出
     */
    private boolean prepareChange(int changeRequired) {
        switch(changeRequired){
            case 0:
                return true;
                
            case 5:
                if(fiveNumber >= 1){
                    fiveNumber--;
                    return true;
                }
                break;
            case 10:
                // 找一张10元的
                if(tenNumber >= 1){
                    tenNumber--;
                    return true;
                }
                // 找两张5元的
                if(fiveNumber >= 2){
                    fiveNumber-=2;
                    return true;
                }
                break;
            case 15:
                // 找一张10元的+一张5元的
                if(tenNumber >= 1 && fiveNumber >= 1){
                    tenNumber--;
                    fiveNumber--;
                    return true;
                }
                // 找3张5元的
                if(fiveNumber >= 3){
                    fiveNumber-=3;
                    return true;
                }
                break;
        }
        return false;
    }
}
class TicketBuyer implements Runnable{
    private TicketSeller ts;
    private int moneyAvailable;
    private String myName;
    
    public TicketBuyer(TicketSeller ts, String name, int moneyAvailable){
        this.ts = ts;
        this.myName = name;
        this.moneyAvailable = moneyAvailable;
    }
    
    public void run() {
        System.out.printf("%s 用 %d 元买票\r\n", this.myName, this.moneyAvailable);
        int change = this.ts.sellTicket(this.moneyAvailable);
        System.out.printf("%s 买到票并拿回 %d 元\r\n", this.myName, change);
    }
}