> ```
> PrimeRun p = new PrimeRun(143);
> new Thread(p).start();
> ```
### **方式一**
```java
//創建線程方式一:繼承Thread類,重寫run()方法,調用start開啟線程
public class One extends Thread{
@Override
public void run(){
//run方法線程體
for (int i = 0; i < 10; i++) {
System.out.println("數字---" + i);
}
}
public static void main(String[] args) {
//main線程,主線程
//創建一個線程對象
One one = new One();
//調用start()方法開啟線程
one.start();
for (int i = 0; i < 1000; i++) {
System.out.println("線程---" + i);
}
}
}
```
### **方式二**
```java
//創建線程方式二:實現runnable接口,重寫run方法,執行線程需要丟入runnable接口實現類,調用start方法。
public class Two implements Runnable{
@Override
public void run() {
//run方法線程體
for (int i = 0; i < 100; i++) {
System.out.println("數字---" + i);
}
}
public static void main(String[] args) {
//創建runnable接口的實現類對象
Two two = new Two();
//創建線程對象,通過線程對象來開啟我們的線程,代理
// Thread thread = new Thread(two);
// thread.start();
new Thread(two).start();
for (int i = 0; i < 100; i++) {
System.out.println("線程--" + i);
}
}
}
```
## 并發任務
初識并發:
```java
public class Ticket implements Runnable{
//票數
private int tickNums = 10;
@Override
public void run() {
while (true){
if (tickNums<=0){
break;
}
//模擬延遲
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
public static void main(String[] args) {
Race race = new Race();
new Thread(race,"兔子").start();
new Thread(race,"烏龜").start();
}
}
```
## 靜態代理模式
```java
public class StaticType {
public static void main(String[] args) {
WedingCompany wedingCompany = new WedingCompany(new You());
wedingCompany.HappyMarry();
}
}
interface Marry{
void HappyMarry();
}
//真實對象,你去結婚
class You implements Marry{
@Override
public void HappyMarry() {
System.out.println("結婚了,超級開心!");
}
}
//代理角色,幫助你結婚
class WedingCompany implements Marry{
private Marry target; //代理誰-->真實目標
public WedingCompany(Marry target){
this.target = target;
}
@Override
public void HappyMarry() {
before();
this.target.HappyMarry();
after();
}
```java
/*
推導Lambda表達式
*/
public class ClassLambda {
//3.靜態內部類
static class Like2 implements ILike {
@Override
public void lambda() {
System.out.println("I like lambda2!");
}
}
public static void main(String[] args) {
ILike like = new Like();
like.lambda();
like = new Like2();
like.lambda();
//4.局部內部類
class Like3 implements ILike{
@Override
public void lambda() {
System.out.println("I like lambda3!");
}
}
like = new Like3();
like.lambda();
//5.匿名內部類,沒有類的名稱,必須借助接口或者父類
like = new ILike() {
@Override
public void lambda() {
System.out.println("I like lambda4!");
}
};
like.lambda();
//6.用lambda簡化
like = ()->{
System.out.println("I like lambda5!");
};
like.lambda();
}
}
//1.定義一個函數式接口
interface ILike{
void lambda();
}
//2.實現類
class Like implements ILike {
@Override
public void lambda() {
System.out.println("I like lambda!");
}
}
```
**簡化Lambda**
```java
public class TestLambda {
public static void main(String[] args) {
//lambda表示簡化
Ilove ilove = (int a) -> {
System.out.println("I love you!" + a);
};
//簡化1.參數類型
ilove = (a) -> {
System.out.println("1.I love you!" + a);
};
//簡化2.簡化括號
ilove = a -> {
System.out.println("2.I love you!" + a);
};
//簡化3.簡化花括號
ilove = a -> System.out.println("3.I love you!" + a);
ilove.love(520);
}
}
interface Ilove{
void love(int a);
}
```
總結:
- lambda表達式只能有一行代碼的情況下才能簡化成為一行,如果有多行,那么就用代碼塊包裹。
- 前提是接口時函數式接口。
- 多個參數也可以去掉參數類型,要去掉都去掉,必須加上括號。
## Stop方法:線程停止
```java
//測試stop
//1.建議線程正常停止--->利用次數,不建議死循環
//2.建議使用標志位--->設置一個標志位
//3.不要使用stop或者destroy等過時或者JDK不建議使用的方法
public class TestStop implements Runnable {
//1.設置一個標志位
private boolean flag = true;
@Override
public void run() {
int i = 0;
while (flag){
System.out.println("run Thread..." + i++);
}
}
//2.設置一個公開的方法停止線程,轉換標志位
public void stop(){
this.flag = false;
}
public static void main(String[] args) {
TestStop testStop = new TestStop();
new Thread(testStop).start();
for (int i = 0; i < 100; i++) {
System.out.println("main" + i);
if (i == 90){
//調用stop方法切換標志位,讓線程停止
testStop.stop();
System.out.println("線程該停止了。");
}
}
}
public static void Down() throws InterruptedException {
int number = 10;
while (true) {
Thread.sleep(1000);
System.out.println(number--);
if (number <= 0)
break;
}
}
}
```
```java
public class TestYield {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield,"a").start();
new Thread(myYield,"b").start();
}
}
class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "-->start");
Thread.yield();
System.out.println(Thread.currentThread().getName() + "-->end");
}
}
```
## Join方法:線程強制執行
- Join合并線程,待線程執行完成后,在執行其他線程,其他線程阻塞
- 不建議使用,容易導致進程阻塞
```java
public class TestJoin implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("VIP插隊" + i);
}
}
public static void main(String[] args) throws InterruptedException {
//啟動我們的線程
TestJoin testJoin = new TestJoin();
Thread thread = new Thread(testJoin);
thread.start();
//主線程
for (int i = 0; i < 100; i++) {
if (i == 10){
thread.join();
}
System.out.println("main" + i);
}
}
}
```
public class TestLock {
public static void main(String[] args) {
wantTicket buy = new wantTicket();
new Thread(buy,"a").start();
new Thread(buy,"b").start();
new Thread(buy,"c").start();
}
}
class wantTicket implements Runnable{
int TicketNum = 10;
private final ReentrantLock lock = new ReentrantLock();
//生產者,消費者,產品,緩沖區
public class TestPC {
public static void main(String[] args) {
SynContainer container = new SynContainer();
new Productor(container).start();
new Consumer(container).start();
}
}
//生產者
class Productor extends Thread{
SynContainer container;
public Productor(SynContainer container){
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
container.push(new Chicken(i));
System.out.println("生產了" +i +"只雞");
}
}
}
//消費者
class Consumer extends Thread{
SynContainer container;
public Consumer(SynContainer container){
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("消費了-->" + container.pop().id + "只雞");
}
}
}
//產品
class Chicken{
int id;
public Chicken(int id) {
this.id = id;
}
}
//緩沖區
class SynContainer{
//需要一個容器大小
Chicken[] chickens= new Chicken[10];
//容器計數器
int count = 0;
```java
//測試生產者消費者問題2-->信號燈法,標志位解決
public class TestPC2 {
public static void main(String[] args) {
TV tv = new TV();
new Player(tv).start();
new Watcher(tv).start();
}
}
//生產者-->演員
class Player extends Thread{
TV tv;
public Player(TV tv){
this.tv = tv;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
if (i % 2 == 0){
this.tv.play("河南衛視");
}else {
this.tv.play("春節聯歡晚會");
}
}
}
}
//消費者-->觀眾
class Watcher extends Thread{
TV tv;
public Watcher(TV tv){
this.tv = tv;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
tv.watch();
}
}
}
//產品-->節目
class TV {
//演員表演,觀眾等待 T
//觀眾觀看,演員等待 F
String voice; //表演的節目
boolean flag = true;