一、线程(Thread)
线程要在进程中运行,进程的结束,那线程也就结束。下面的QQ浏览器就是一个进程,而打开的一个个网页则是线程,如果只打开了一个网页就相当于单线程。了解了线程及进程,下面我们来看看
创建多线程的方式有三种:
1、继承Thread类,重写run方法:
public class TheadCreate extends Thread { //继承Thead类来创建
//重写run方法,run方法是执行里面的内容
@Override
public void run() {
System.out.println("这是线程创建的第一个方法");
}
public static void main(String[] args) {
new TheadCreate().start();// 创建并启用线程
TheadCreate tc = new TheadCreate();
Thread thread = new Thread(tc);
thread.start();
}
}
main方法中有两种方法来启动线程,如果只执行第一个start()方法为单线程,执行整个main方法为多线程。
2、实现Runnable的接口,重写run方法:
public class ThreadCreate2 implements Runnable {// 实现Runnable接口创建线程
@Override
public void run() {
System.out.println("重写run方法来创建接口");
}
public static void main(String[] args) {
ThreadCreate2 t2 = new ThreadCreate2();
Thread t = new Thread(t2);
t.start();
}
}
3、第三种很少用,直接上代码:
import java.util.concurrent.*;
public class ThreadCreate3 implements Callable {
@Override
public Object call() throws Exception {
Integer result = 10;
for (;result>0;result--){
System.out.println("第三种线程创建执行了"+result+"次");
}
return result;
}
public static void main(String[] args) {
ThreadCreate3 t3 = new ThreadCreate3();
// 线程任务
FutureTask<Integer> ft = new FutureTask<>(t3);
// 线程池来执行
ExecutorService es = Executors.newFixedThreadPool(2);
// 提交
es.submit(ft);
try {
System.out.println(ft.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
这就是三种线程的创建。
线程问题解决了,那就有一种问题,就是线程的并发和并行,来看下面的这张图:
并行就是在这个一时刻,同时发生。
并发就是在这一时间段发生的。通俗点讲,双十一淘宝抢购00:00:00时到00:30:00中来打折商品,那么在这个时间段登录淘宝的人就是并发,那登录的人就相当于线程,淘宝的运行,相当于进程。
说说代码问题,run方法是执行run中的内容;start()则是启动线程。
下面是一个火车票的练习:
首先来看题,设置一个总票数,总票数自己定,有三个窗口,这三个窗口相当于线程,直接上代码:
public class TrainTicket implements Runnable {
// 设置票数为100
static int ticket = 30;
// 创建对象
static Object oj = new Object();
@Override
public void run() {
for (;;){
try {
Thread.sleep(1000); //线程睡眠1秒
synchronized (oj) { //线程锁,里面所包裹的则是同步代码
if (ticket > 0) {
// Thread.currentThread().getName() 为得到线程的名字
System.out.println(Thread.currentThread().getName() + "正在出票,票号为" + ticket--);
} else {
System.out.println("票已售完!");
System.exit(0); //结束进程
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TrainTicket tt = new TrainTicket();
Thread t = new Thread(tt);
Thread t1 = new Thread(tt);
Thread t2 = new Thread(tt);
// 给线程起一个名字
t.setName("第一窗口");
t1.setName("第二窗口");
t2.setName("第三窗口");
// 启动三个线程
t.start();
t1.start();
t2.start();
}
}
好啦,今天的线程就先到这里啦,如果有什么讲的不对的地方大家多多提提意见。