头歌作业-Java多线程

1.创建多线程

继承Thread重写run

package step1;

public class CreateThreadPractice {

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        // ---------------------Begin------------------------
        //开启线程
        myThread.start();

        // ---------------------End------------------------
    }
}
// ---------------------Begin------------------------
//继承Thread编写名为MyThead的类,代码内容为循环输出10遍: 线程在运行......

class MyThread extends Thread{
    public  void run()
    {
       for(int i=0;i<10;i++) System.out.println("线程在运行......");
    }
}


// ---------------------End------------------------

 2.使用Callable接口创建多线程

package step2;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
// ---------------------Begin------------------------
//tips: 输出语句为:Thread.currentThread().getName()+"的call()方法在运行"
//定义一个实现Callable接口的实现类,类名必须命名为MyThread_callable

// ---------------------End------------------------
public class CallableExample {
    public static void main(String[] args) throws Exception,
            ExecutionException {
        // 创建Callable接口的实现类对象
        MyThread_callable myThread3 = new MyThread_callable();
        // 使用FutureTask封装Callable接口
        FutureTask<Object> ft1 = new FutureTask<>(myThread3);
        // 使用Thread(Runnable target ,String name)构造方法创建线程对象
        Thread thread1 = new Thread(ft1, "thread1");
        // 创建并启动另一个线程thread2
        FutureTask<Object> ft2 = new FutureTask<>(myThread3);
        Thread thread2 = new Thread(ft2, "thread2");
        // ---------------------Begin------------------------
        // 调用线程对象的start()方法启动线程
        thread1.start();
        Thread.sleep(1000);
        thread2.start();    
        Thread.sleep(1000);
        // 可以通过FutureTask对象的方法管理返回值
        System.out.println("thread1返回结果:"+ft1.get());
        System.out.println("thread2返回结果:"+ft2.get());
        // ---------------------End------------------------
    }
    
}
class MyThread_callable implements Callable<Object>{
    // @Override
    public Object call() throws Exception{
        for(int i=0;i<5;i++) System.out.println(Thread.currentThread().getName()+"的call()方法在运行");
        return Thread.currentThread().getName();
    }
}

 3.使用Runable接口创建多线程

package step3;
// ---------------------Begin------------------------
//定义一个实现Runnable接口的实现类,类名必须命名为MyThread_runable
//tips: 输出语句为:Thread.currentThread().getName()+"的run()方法在运行"
class MyThread_runable implements Runnable{
    @Override
    public void run(){
        for(int i=0;i<3;i++) System.out.println(Thread.currentThread().getName()+"的run()方法在运行");
    }
}




// ---------------------End------------------------






// ---------------------End------------------------

 4.多线程中的售票问题

package step4;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SellTicket extends Thread {
    //多线程共享资源,票数为30张
    private static ReentrantLock lock = new ReentrantLock();
	private static int ticket = 30;

	@Override
	public void run() {

		while (true) {
			try {
				lock.lock();

				if (ticket > 0) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e1) {
						// TODO 自动生成的 catch 块
						e1.printStackTrace();
					}
					System.out.println("卖出了第" + ticket + "张票");
					ticket--;
				} else {
					System.out.println("票卖完了");
					System.exit(0);
				}

			} finally {

				lock.unlock();

			}

		}
    
    // ---------------------End------------------------
}

}
/********* End *********/

 5.

猜你喜欢

转载自blog.csdn.net/screamn/article/details/131082135
今日推荐