假设一个项目拥有三块独立代码块,需要执行,什么时候用多线程?
这些代码块某些时候需要同时运行,彼此独立,那么需要用到多线程操作更快。。。
这里把模板放在这里,需要用的时候寻找合适的来选用。
总体分为两种:
一、使用匿名内部类的方式(推荐)
1)方式1开启多线程(Thread)
//使用第一种方式,开启线程
newThread()
{public voidrun()
{for(int i=0;i<100;i++)
{
System.out.println(Thread.currentThread().getName()+"线程方式1"+i);
}
}
}.start();
2)方式2内部开启线程(Runnable)
//使用第二种方式,开启线程
Runnable r =newRunnable()
{public voidrun()
{for(int i=0;i<100;i++)
{
System.out.println(Thread.currentThread().getName()+".....方式2++"+i);
}
}
};//不可或缺
new Thread(r).start();
二、通过在外部定义类,类的实例化开启线程
3)使用第三种方式,类实例化开启线程(继承方式)
类定义:
class ThreadTest extendsThread
{public voidrun()
{for(int i=0;i<100;i++)
{
System.out.println(Thread.currentThread().getName()+".....类的方式(extends)----"+i);
}
}
}
主函数中调用:
//使用第三种方式,类实例化开启线程(继承方式)
new ThreadTest().start();
4)使用第四种方式,类实例化开启线程(实现方式)
类定义:
class RunnableTest implementsRunnable
{public voidrun()
{for(int i=0;i<100;i++)
{
System.out.println(Thread.currentThread().getName()+".........类的方式(implements)----++"+i);
}
}
}
主函数调用:
//使用第四种方式,类实例化开启线程(实现方式)
new Thread(new RunnableTest()).start();
附测试代码:
1 classThreadUseDemo2 {3 public static voidmain(String[] args)4 {5 //System.out.println("Hello World!");6 //使用第一种方式,开启线程
7 newThread()8 {9 public voidrun()10 {11 for(int i=0;i<100;i++)12 {13 System.out.println(Thread.currentThread().getName()+"线程方式1"+i);14 }15
16 }17 }.start();18 //主线程在这里运行
19 for(int i=0;i<100;i++)20 {21 System.out.println(Thread.currentThread().getName()+"前台线程"+i);22 }23
24 //使用第二种方式,开启线程
25 Runnable r =newRunnable()26 {27 public voidrun()28 {29 for(int i=0;i<100;i++)30 {31 System.out.println(Thread.currentThread().getName()+".....方式2++"+i);32 }33 }34 }; //不可或缺
35 newThread(r).start();36
37 //使用第三种方式,类实例化开启线程(继承方式)
38 newThreadTest().start();39 //使用第四种方式,类实例化开启线程(实现方式)
40 new Thread(newRunnableTest()).start();41 }42 }43
44 class ThreadTest extendsThread45 {46 public voidrun()47 {48 for(int i=0;i<100;i++)49 {50 System.out.println(Thread.currentThread().getName()+".....类的方式(extends)----"+i);51 }52 }53
54 }55 class RunnableTest implementsRunnable56 {57 public voidrun()58 {59 for(int i=0;i<100;i++)60 {61 System.out.println(Thread.currentThread().getName()+".........类的方式(implements)----++"+i);62 }63 }64 }
ThreadUseDemo .java
线程学习告一段落了,之后关于线程其他的知识点,这里记下笔记,用的时候再说:
1)线程停止:
通过在主函数中控制标志位来中止子线程的循环状态,特殊情况:
当现场处于冻结状态(wait)时,就读取不到flag标记,那么线程就不会结束。解决办法:
Interrupt:清楚冻结状态,当然此时会抛异常,在异常中更改标志位即可
wait ---
sleep ----===》一砖头下去---》清醒(运行态)抛异常->有人强制结束,可以获取运行资格,操作标记为false,循环判断为假,线程结束
2)守护线程
eg: t1.setDaemon(true);//此时t1线程为守护线程,开启后和前台线程共同运行,互抢CPU资格,但当主线程(前台)结束后,守护线程也自动停止(依赖于前台主线程)
3) join()
eg: t1.start();t1.join();//t1在start后,join表示向CPU申请执行权(CPU交出,处于wait状态),t1和其他正在运行的线程一起争夺,直到t1结束后交还资格给CPU
4) 线程组:谁开启的线程,就属于某个组(几乎用不到)
5)线程优先级:1--10,默认为5,经常用得到有:MIN_PRIORITY (1);MAX_PRIORITY (10); NORM_PRIORITY (5 )
定义:
这是java线程的优先级:
java.lang.Thread
public static final int MAX_PRIORITY 10
public static final int MIN_PRIORITY 1
public static final int NORM_PRIORITY 5
使用:
1 //第一种方案
2 class MyThead implementsRunnable3 {4 public voidrun()5 {6 for (int i = 1; i <= 10; i++)7 {8 System.out.println(Thread.activeCount() + "thread======>AAA");9 }10 }11 }12 //第二种方案
13 class MyThreadRunnable extendsThread14 {15
16 public voidrun()17 {18 for (int i = 1; i <= 10; i++)19 {20 System.out.println(Thread.activeCount() + "thread======BBB");21 }22 }23
24 }25
26 public classTheadMain27 {28 public static voidmain(String[] args)29 {30 MyThead myThead = newMyThead();31 Thread thread = newThread(myThead);32 MyThreadRunnable thread2 = newMyThreadRunnable();33 thread.start();34 thread.setPriority(Thread.MIN_PRIORITY);35 thread2.start();36 thread2.setPriority(Thread.MAX_PRIORITY);37 }38 }