java多线程基础
Posted fyccaishao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程基础相关的知识,希望对你有一定的参考价值。
多线程的介绍
进程与线程
进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
线程:线程是进程中的一个执行单元,我们程序中的代码都是由线程来执行的,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
创建线程的方式
- 继承Thread,重写run方法
- 实现Runable接口,实现run方法,
- 实现Callable接口的call方法,使用Futrue包装Callable接口。
- 使用线程池创建线程。
代码:
/** * * @author admin * 线程创建一般有四种方式 * */ class MyThreadDemo1 extends Thread{ //重写run方法 @Override public void run() { System.out.println(Thread.currentThread().getName()+"--继承Thread的创建线程方式"); } } class MyTheadDemo2 implements Runnable{ //实现run方法 @Override public void run() { System.out.println(Thread.currentThread().getName()+"--Runnable的创建线程方式"); } } //实现Callable接口 //1.创建Callable接口的实现类,并实现call()方法 //2.创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。 //3.使用FutureTask对象作为Thread对象的target创建并启动新线程。 //4.调用FutureTask对象的get()方法来获得子线程执行结束后的返回值 class MyThreadDemo3 implements Callable<Object>{ @Override public Object call() throws Exception { System.out.println(Thread.currentThread().getName()+"--callable的创建线程方式"); return null; } } public class MyThread1 { public static void main(String[] args) { //使用匿名类调用 new Thread(new MyThreadDemo1()).start(); new Thread(new MyTheadDemo2()).start(); new Thread(new MyTheadDemo2()).start(); //callable的 FutureTask<Object> futureTask = new FutureTask<Object>(new MyThreadDemo3()); new Thread(futureTask).start(); //使用线程池创建线程 ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3); System.out.println(newFixedThreadPool); newFixedThreadPool.submit(new MyTheadDemo2()); newFixedThreadPool.submit(futureTask); } }
使用匿名内部类创建模拟买票class Ticket {// 资源类 private int number = 30;
//ReentrantLock请查看文档说明 private Lock lock=new ReentrantLock(); /* * public synchronized void saleTicket() { if (number > 0) { * * System.out.println(Thread.currentThread().getName() + "\\t卖出第:" + (number--) + * "\\t还剩下:" + number); } } */ public void saleTicket() { lock.lock(); try {
//这里使用if会出现虚假唤醒
//多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不用if)
while(number > 0) { System.out.println(Thread.currentThread().getName() + "\\t卖出第:" + (number--) + "\\t还剩下:" + number); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { lock.unlock(); } } } /** * * @author admin 多线程的编程就是 在高内聚低耦合的前提下,使用线程 操作(对外暴露的调用方法) 资源类/ * */ public class MyThread2 { public static void main(String[] args) { Ticket ticket = new Ticket(); // 使用lamber表达式创建 /* * new Thread(()->{ ticket.saleTicket(); },"aa").start(); } */new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 40; i++) { ticket.saleTicket(); } } },"aa").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 40; i++) { ticket.saleTicket(); } } },"bb").start(); } }
线程的状态
以上是关于java多线程基础的主要内容,如果未能解决你的问题,请参考以下文章