1.什么是进程、线程
2.创建线程的方式(三种)
-
1. 采用实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。
-
2. 使用继承 Thread 类的方式创建多线程时,编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread() 方法,直接使用 this 即可获得当前线程。
3.线程的状态及特性
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
MyThread myThread=<span style="color: #0000ff;">new</span> MyThread("name"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">myThread.run();</span><span style="color: #008000;">//</span><span style="color: #008000;">主线程</span>
myThread.start();<span style="color: #008000;">//</span><span style="color: #008000;">多线程</span>
<span style="color: #000000;"> }
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> MyThread() {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated constructor stub</span>
<span style="color: #000000;"> }
<span style="color: #0000ff;">super<span style="color: #000000;">(name);
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {
</span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0;i<20;i++<span style="color: #000000;">) {
System.out.println(Thread.currentThread().getName()</span>+"→"+<span style="color: #000000;">i);
}
}
}
创建线程,输出1~100之间的偶数。要求使用线程实现,继承Thread类
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
OutputEven outputEven=<span style="color: #0000ff;">new</span><span style="color: #000000;"> OutputEven();
outputEven.start();
}
}
<span style="color: #0000ff;">class OutputEven <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=1;i<=100;i++<span style="color: #000000;">) {
</span><span style="color: #0000ff;">if</span>(i%2==0<span style="color: #000000;">) {
System.out.println(Thread.currentThread().getName()</span>+"→"+<span style="color: #000000;">i);
}
}
}
}
使用线程模拟四个工人搬砖场景,谁抢到托运机谁去搬砖
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
Worker worker1=<span style="color: #0000ff;">new</span> Worker("张三1","搬砖"<span style="color: #000000;">);
Worker worker2</span>=<span style="color: #0000ff;">new</span> Worker("张三2","搬砖"<span style="color: #000000;">);
Worker worker3</span>=<span style="color: #0000ff;">new</span> Worker("张三3","搬砖"<span style="color: #000000;">);
Worker worker4</span>=<span style="color: #0000ff;">new</span> Worker("张三4","搬砖"<span style="color: #000000;">);
worker1.start();
worker2.start();
worker3.start();
worker4.start();
}
}
<span style="color: #0000ff;">class Worker <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{
String name;
String task;
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Worker() {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated constructor stub</span>
<span style="color: #0000ff;">super</span><span style="color: #000000;">();
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Worker(String name,String task) {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
</span><span style="color: #0000ff;">this</span>.task =<span style="color: #000000;"> task;
}
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
<span style="color: #000000;"> work();
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> work() {
System.out.println(name+"正在"+<span style="color: #000000;">task);
}
}
三个窗口都可以卖100张票。
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
WinTicket winTicket1=<span style="color: #0000ff;">new</span> WinTicket("窗口1"<span style="color: #000000;">);
WinTicket winTicket2</span>=<span style="color: #0000ff;">new</span> WinTicket("窗口2"<span style="color: #000000;">);
WinTicket winTicket3</span>=<span style="color: #0000ff;">new</span> WinTicket("窗口3"<span style="color: #000000;">);
winTicket1.start();
winTicket2.start();
winTicket3.start();
}
}
<span style="color: #0000ff;">class WinTicket <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{
<span style="color: #0000ff;">private <span style="color: #0000ff;">int ticket=100<span style="color: #000000;">;
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> WinTicket() {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated constructor stub</span>
<span style="color: #000000;"> }
<span style="color: #0000ff;">public<span style="color: #000000;"> WinTicket(String name) {
<span style="color: #0000ff;">super<span style="color: #000000;">(name);
}
@Override
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> run() {
<span style="color: #008000;">//<span style="color: #008000;"> TODO Auto-generated method stub
<span style="color: #0000ff;">while(<span style="color: #0000ff;">true<span style="color: #000000;">) {
<span style="color: #0000ff;">if(ticket>0<span style="color: #000000;">) {
String name=<span style="color: #000000;">Thread.currentThread().getName();
System.out.println(name+"卖出"+ticket--<span style="color: #000000;">);
}<span style="color: #0000ff;">else<span style="color: #000000;"> {
<span style="color: #0000ff;">break<span style="color: #000000;">;
}
}
}
}
4.多个线程共享资源
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub
</span><span style="color: #008000;">//</span><span style="color: #008000;">创建共享资源对象</span>
TicketRes ticketRes=<span style="color: #0000ff;">new</span><span style="color: #000000;"> TicketRes();
</span><span style="color: #008000;">//</span><span style="color: #008000;">创建线程对象</span>
Thread w1=<span style="color: #0000ff;">new</span> Thread(ticketRes,"窗口1"<span style="color: #000000;">);
Thread w2</span>=<span style="color: #0000ff;">new</span> Thread(ticketRes,"窗口2"<span style="color: #000000;">);
Thread w3</span>=<span style="color: #0000ff;">new</span> Thread(ticketRes,"窗口3"<span style="color: #000000;">);
w1.start();
w2.start();
w3.start();
}
}
<span style="color: #008000;">//<span style="color: #008000;">共享资源类
<span style="color: #0000ff;">class TicketRes <span style="color: #0000ff;">implements<span style="color: #000000;"> Runnable{
<span style="color: #0000ff;">private <span style="color: #0000ff;">int ticket=100<span style="color: #000000;">;
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
<span style="color: #0000ff;">while</span>(<span style="color: #0000ff;">true</span><span style="color: #000000;">) {
</span><span style="color: #0000ff;">if</span>(ticket>=1<span style="color: #000000;">) {
System.out.println(Thread.currentThread().getName()</span>+"卖第"+ticket+"张票"<span style="color: #000000;">);
ticket</span>--<span style="color: #000000;">;
}</span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
}
}
}
}
<span style="color: #008000;">//<span style="color: #008000;">出现一个问题:第一百张票会同时在三个窗口卖出。这个涉及到同步和异步的问题?该怎么解决呢?<a href="https://www.cnblogs.com/loober/p/10235234.html" target="_blank">Java多线程基础(二)揭晓答案
5.线程调度
优先级
调度方法