JAVA多线程扫盲

1.继承Thread类,重写该类的run()方法。

class MyThread extends Thread {

    private int i = 0;

    @Override

    public void run() {

        for (i = 0; i < 100; i++) {

            System.out.println(Thread.currentThread().getName() + " " + i);

        }

    }

}

 

public class ThreadTest {

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {

            System.out.println(Thread.currentThread().getName() + " " + i);

            if (i == 30) {

                Thread myThread1 = new MyThread();

                Thread myThread2 = new MyThread(); 

                myThread1.start(); 

                myThread2.start();

            }

        }

    }

}


2.实现Runnable接口,并重写该接口的run()方法

class MyRunnable implements Runnable {

    private int i = 0;

    @Override

    public void run() {

        for (i = 0; i < 100; i++) {

            System.out.println(Thread.currentThread().getName() + " " + i);

        }

    }

}

 

public class ThreadTest {

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {

            System.out.println(Thread.currentThread().getName() + " " + i);

            if (i == 30) {

                Runnable myRunnable = new MyRunnable(); 

                Thread thread1 = new Thread(myRunnable); 

                Thread thread2 = new Thread(myRunnable);

                thread1.start(); 

                thread2.start();

            }

        }

    }

}

 

3.比较简洁的写法

  new Thread(new Runnable() {

   @Override

     public void run() {

           //具体实现

      }

   }).start();

这种写法是利用了匿名内部类

同等这种写法,实例化了一个Runnable接口子类的实例
Thread t=new Thread(new MyRunnable());
public class MyRunnable implements Runnable{
@Override
public void run() {
  //具体实现
}
}

t.start();

 

4.使用Callable和Future接口创建线程

public class ThreadTest {

    public static void main(String[] args) {

        Callable<Integer> myCallable = new MyCallable();    

        FutureTask<Integer> ft = new FutureTask<Integer>(myCallable); 

        for (int i = 0; i < 100; i++) {

            System.out.println(Thread.currentThread().getName() + " " + i);

            if (i == 30) {

                Thread thread = new Thread(ft); 

                thread.start(); 

            }

        }

        System.out.println("主线程for循环执行完毕..");

        try {

            int sum = ft.get(); 

            System.out.println("sum = " + sum);

        } catch (InterruptedException e) {

            e.printStackTrace();

        } catch (ExecutionException e) {

            e.printStackTrace();

        }

    }

}

 

class MyCallable implements Callable<Integer> {

    private int i = 0;

    // 与run()方法不同的是,call()方法具有返回值

    @Override

    public Integer call() {

        int sum = 0;

        for (; i < 100; i++) {

            System.out.println(Thread.currentThread().getName() + " " + i);

            sum += i;

        }

        return sum;

    }

 

}

 

以下是生产者消费者模式

public class ProducerConsumer {

 

public static void main(String[] args) {

SyncStack ss = new SyncStack();

Producer pp = new Producer(ss);

Consumer cc = new Consumer(ss);

new Thread(pp).start();

new Thread(cc).start();

 

}

}

 

class WoTou {

int id;

WoTou(int id) {

this.id = id;

}

public String toString() {

return "WoTou id:" + id;

}

}

 

class SyncStack {

int index = 0;

WoTou[] arrWt = new WoTou[6];

public synchronized void push(WoTou wt) {

while (index == arrWt.length) {

try {

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

// 叫醒一个现在正在wait该对象上的线程

this.notify();

arrWt[index] = wt;

index++;

}

 

public synchronized WoTou pop() {

while (index == 0) {

try {

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

this.notify();

index--;

return arrWt[index];

}

}

 

// 生产

class Producer implements Runnable {

SyncStack ss = null;

Producer(SyncStack ss) {

this.ss = ss;

}

 

public void run() {

for (int i = 0; i < 6; i++) {

WoTou wt = new WoTou(i);

ss.push(wt);

System.out.println("生产了:" + wt);

try {

Thread.sleep((int) Math.random() * 2);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

 

// 消费

class Consumer implements Runnable {

SyncStack ss = null;

Consumer(SyncStack ss) {

this.ss = ss;

}

 

public void run() {

for (int i = 0; i < 6; i++) {

WoTou wt = ss.pop();

System.out.println("消费了:" + wt);

try {

Thread.sleep((int) Math.random() * 1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

sleep()使线程睡过去,也就是暂停执行,或者让出cpu给别的线程使用..

wait()是线程等待事件的发生,如果你的线程需要某个条件才能继续运行,就用wait(),他不占资源,只是不运行线程而已 等待命令的意思

notify()通知相应的在等待的线程条件已经满足,可以启动了,采用wait()的线程只能够通过notify或者是notifyAll()启动,不能够自己启动的.
// sleep 时别的线程不可以访问锁定对象

基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip 【备注】 1、该资源内项目代码百分百可运行,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值