多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。
什么是线程呢?线程是程序执行的一条路径,一个进程可以包含多个线程。
JVM是多线程的,因为开启JVM至少有一个主线程和垃圾回收线程。
多线程创建的两种方法
1.继承Thread
package com.tao.thread;
public class Demo1_Thread {
public static void main(String[] args) {
Mythread mt=new Mythread(); //创建Thread类的子类对象
mt.start(); //开启线程
for(int j=0;j<1000;j++){
System.out.println("bbb");
}
}
}
class Mythread extends Thread{ //1.继承Thread
public void run(){ //2.重写run方法
for(int i=0;i<10000;i++){
System.out.println("aaaaaaa");
}
}
}
2.实现Runnable接口
package com.tao.thread;
public class Demo2_Thread {
public static void main(String[] args) { //创建MyRunnable类的子类对象
MyRunnable mr=new MyRunnable();
new Thread(mr).start(); // 将mt作为参数传递给Thread构造函数
for(int j=0;j<1000;j++){
System.out.println("bbb");
}
}
}
class MyRunnable implements Runnable{ //定义一个类实现Runnable
@Override
public void run() { //重写run方法
for(int i=0;i<10000;i++){
System.out.println("aaaaaaa");
}
}
}
1.继承Thread
优点:可直接使用Thread类的方法,代码简单
缺点:如果已经有父类,就不能用这种方法
2.实现Runnable接口
优点:有父类没关系,接口是多实现的
缺点:不能直接使用Thread类的方法,需获取Thread对象,代码复杂
多线程(匿名内部类实现线程的两种方式)
package com.tao.thread;
/**
*
* @author天外飞星
* 多线程(匿名内部类实现线程的两种方式)
*/
public class Demo3_Thread {
public static void main(String[] args) {
new Thread() {
public void run() { // 重写run方法
for (int i = 0; i < 10000; i++) {
System.out.println("aaaaaaa");
}
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println("bbbbbb");
}
}
}).start();
}
}
获取当前线程的对象及名字的set与get
package com.tao.thread;
/**
*
* @author天外飞星
*多线程(获取当前线程的对象及名字的set与get)
*/
public class Demo4_Thread {
public static void main(String[] args) {
//a线程
new Thread() {
public void run() { // 重写run方法
System.out.println(getName()+"aaaaaaa");
}
}.start();
//b线程
new Thread(new Runnable() {
@Override
public void run() {
//Thread.currentThread()获取当前线程的对象
System.out.println(Thread.currentThread().getName()+"bbbbbb");
}
}).start();
//主线程
Thread.currentThread().setName("我是主线程");
System.out.println(Thread.currentThread().getName());
}
}
睡眠线程
在这里插入代码片package com.tao.threadmethod;
/**
* 休眠线程
* @author 天外飞星
*
*/
public class Demo2_Sleep {
public static void main(String[] args) {
new Thread() {
public void run() { // 重写run方法
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000); //睡眠1s
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(getName()+"aaaaaaa");
}
}
}.start();
new Thread() {
public void run() { // 重写run方法
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(getName()+"bbbbbb");
}
}
}.start();
}
}
守护线程
t2守护t1,好比下象棋,帅死了,车马象士也就死了,车马象士即守护线程(t2),帅好比非守护线程,一但t1执行完,t2也会结束,但可能会有一段时间缓冲。
package com.tao.threadmethod;
public class Demo3_Daemon {
public static void main(String[] args) {
Thread t1=new Thread(){
public void run(){
for(int i=0;i<2;i++){
System.out.println("aa");
}
}
};
Thread t2=new Thread(){
public void run(){
for(int i=0;i<1000;i++){
System.out.println("bbbb");
}
}
};
t2.setDaemon(true); //传入true意味着设置为守护线程
t1.start();
t2.start();
}
}
加入线程
package com.tao.threadmethod;
public class Demo_Join {
/**加入线程
* @param args
*/
public static void main(String[] args) {
final Thread t1=new Thread(){
public void run(){
for(int i=0;i<1000;i++){
System.out.println("aa");
}
}
};
Thread t2=new Thread(){
public void run(){
for(int i=0;i<20;i++){
if(i==2){
try {
// t1.join(); t1插队,t1执行完,t2再继续
t1.join(1);///t1插队1ms,然后t1,t2交替执行
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("bb");
}
}
};
t1.start();
t2.start();
}
}
礼让线程
package com.tao.threadmethod;
/**
* 礼让线程
* @author 天外飞星
*效果不太明显
*/
public class Demo4_Yield {
public static void main(String[] args) {
new MyThread().start();
new MyThread().start(); //开启两条线程
}
}
class MyThread extends Thread{
public void run(){
for(int i=0;i<1000;i++){
if(i%10==0){
Thread.yield(); //让出cpu
}
System.out.println(getName()+"...."+i);
}
}
}
设置线程的优先级
package com.tao.threadmethod;
/**
*
* @author 天外飞星
*_多线程(设置线程的优先级)
*/
public class Demo5_Priority {
/**
* @param args
*/
public static void main(String[] args) {
Thread t1=new Thread(){
public void run(){
for (int i = 0; i < 100; i++) {
System.out.println(getName()+"aaa");
}
}
};
Thread t2=new Thread(){
public void run(){
for (int i = 0; i < 100; i++) {
System.out.println(getName()+"bbb");
}
}
};
t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MIN_PRIORITY);
//不设置默认为5
t1.setPriority(10);//设置线程的优先级10为最大 ,或写成t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(1);//设置线程的优先级1为最大,或写成t2.setPriority(Thread.MIN_PRIORITY);
t1.start();
t2.start();
}
}