JAVA线程总结(一)

多线程作为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();

	}

}

大家不懂得可以随时评论问博主呦*

猜你喜欢

转载自blog.csdn.net/qq_42429369/article/details/84143392
今日推荐