方式一:继承Thread类
package com.cvicse.thread.demo;
/**
* 多线程实现一:继承Thread类
* @author 13169
*
*/
class MyThread extends Thread{
private String name ;
private int ticket =10;
public MyThread() {
}
public MyThread(String name) {
this.name=name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if(ticket>0) {
System.out.println(Thread.currentThread().getName()+" 卖票:"+this.ticket--);
}
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyThread mt1 = new MyThread("A线程");
MyThread mt2 = new MyThread("B线程");
MyThread mt3 = new MyThread("C线程");
//线程启动
mt1.start();
mt2.start();
mt3.start();
/**
* 使用Thread类的start()方法不仅仅要启动多线程的执行代码,
* 还要去根据不同的操作系统进行资源的分配
*
* 线程的运行不是像其他方法那么简单的调用一下就运行的。
* 想要运行一个线程,肯定是要和操作系统打交道,告诉操作系统我要添加一个线程,
* run方法只是个简单的方法,里面就是你要运行的代码。
* start方法里面会调用一个native方法,这个方法才是真正和操作系统交流的
*/
}
}
方式二:实现Runnable接口 数据共享
package com.cvicse.thread.demo;
/**
* 多线程实现方式二:实现Runnable接口 数据共享
* @author 13169
*
*/
class MyRunnableThread implements Runnable{
private int ticket =10;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if(ticket>0) {
//取得当前线程对象Thread.currentThread()
System.out.println(Thread.currentThread().getName()+" 卖票:"+this.ticket--);
}
}
}
}
public class RunnableDemo {
public static void main(String[] args) {
MyRunnableThread mt = new MyRunnableThread();
//线程启动 多个线程对象访问同一资源
new Thread(mt,"A线程").start();
new Thread(mt,"B线程").start();
new Thread(mt,"C线程").start();
}
}
方式三:实现Callable接口
package com.cvicse.thread.demo;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 多线程实现三:实现Callable接口
* @author 13169
*
*/
public class CallableThreadDemo implements Callable<String>{
private int ticket = 10;
@Override
public String call() throws Exception {
for (int i = 0; i < 100; i++) {
if(this.ticket>0) {
System.out.println(Thread.currentThread().getName()+" 卖票: "+this.ticket--);
}
}
return "票已卖光";
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
CallableThreadDemo ct = new CallableThreadDemo();
/**
* FutureTask可以接收Callable接口对象
* FutureTask是Runnable的子类
*/
FutureTask<String> ft1 = new FutureTask<String>(ct);
FutureTask<String> ft2 = new FutureTask<String>(ct);
new Thread(ft1).start();
new Thread(ft2).start();
System.out.println(ft1.get());
System.out.println(ft2.get());
/*每一个JVM进程启动时候至少启动两个线程
* (1)main线程:程序的主要执行,以及启动子线程
* (2)gc线程:负责垃圾收集
* */
}
}
方式四:匿名内部类
package com.cvicse.thread.demo;
/**
* 多线程的实现四:匿名内部类
* @author 13169
*
*/
public class InnerClassThreadDemo {
public static void main(String[] args) {
Thread t1 =new Thread(new Runnable() {
private int ticket =10;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if(ticket>0) {
//取得当前线程对象Thread.currentThread()
System.out.println(Thread.currentThread().getName()+" 卖票:"+this.ticket--);
}
}
}
});
//启动多线程
t1.start();
}
}
方式五:使用线程池创建线程