看到一个利用多线程来排序的博客,觉得蛮有意思,来学习下多线程。 大神博客:http://blog.csdn.net/QQ_25827845/article/details/54800064
public class SleepSort { /** * @param args */ public static void main(String[] args) { int[] arr={1,4,3,2,9,7}; SortThread[] sortThreads=new SortThread[arr.length]; //每一个线程数组的值 for(int i=0;i<sortThreads.length;i++){ sortThreads[i]=new SortThread(arr[i]); } //开启每个线程 for(int i=0;i<sortThreads.length;i++){ sortThreads[i].start(); } }}class SortThread extends Thread{ PRivate int s=0; public SortThread(int s){ this.s=s; } /** * 定义一个线程,按对象中的a的大小来设置睡眠时间 */ public void run(){ try { sleep(s*10+10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //大的数睡眠时间长,小的数睡眠的时间短,从小到大输出 System.out.println(s); }}执行结果:
正文: 一 线程的创建与启动 1 继承Thread类
public class TextDemo_05 extends Thread{ private int i; /** * 重写父类的方法 */ public void run(){ for(;i<100;i++){ //当继承Thread类时,getName即可获取当前线程的名称 System.out.println(getName()+" "+i); } } public static void main(String[] args) { // TODO Auto-generated method stub for(int i=0;i<100;i++){ //显示当前正在执行的线程对象的名称,其中Thread.currentThread()返回的是当前的线程 System.out.println(Thread.currentThread().getName()); if(i==20){ //启动线程 new TextDemo_05().start(); new TextDemo_05().start(); } } }}运行结果: (http://img.blog.csdn.net/20170215233227507?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQnRXYW5nWmhp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
执行会发现,程序显式的创建两个线程,还有一个是main()方法确定的,代表主线程创建,两个线程的i变量不连续,变量i是全局变量,创建了两个TextDemo_05对象,两个变量,变量不共享。
2 实现Runnable接口中的run方法创建线程。
public class TextDemo_06 implements Runnable{ private int i; /** * 实现Runnable接口中的方法,线程的执行体 */ public void run() { for(;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); } } public static void main(String[] args) { for (int i = 0; i < 100; i++) { //实现Runnable接口时,如果想获取当前线程,只能用Thread.currentThread()方法System.out.println(Thread.currentThread().getName()); if (i == 20) { // 创建对象 TextDemo_06 demo_06_01 = new TextDemo_06(); // 将创建的对象作为Thread的target来创建对象, //通过new Thread(target,name)创建两个线程,启动 //为线程指定一个名称 new Thread(demo_06_01, "线程1").start(); new Thread(demo_06_01, "线程2").start(); } } }} 从运行结果可以看出,两个子线程的i变量是连续的,两个线程共享线程类的实例变量, 总结: 实现Runnable类可以共享同一个类的对象,非常适合多个线程来处理同一份资源的情况,因为实现的是一个接口,还可以继承其他类。获取当前线程名称只能用Thread.currentThread().getName() 继承Thread类导致不能继承其他类,访问当前线程无需使用Thread.currentThread()方法。一般使用Runnable接口来创建线程。 二 线程生命周期 新建–》就绪–》运行–》阻塞–》死亡 当程序使用new 关键字创建了一个线程之后,该线程就处于新建状态,当线程对象调用start方法之后,该线程处于就绪状态,该线程的执行取决于JVM里线程调度器的调度。
三 线程睡眠: Thread.sleep()和Thread.yield()方法的区别: sleep()暂停当前的线程,进入阻塞状态,让出cpu让CPU去执行其他线程,不会理会优先级, yield()不会让线程进入阻塞状态,强制进入就绪状态,给那些优先级与它相同或比他还高的线程来执行。 四 改变线程的优先级:
运行结果: 设置优先级只是会让优先级高的获得较多的执行机会,而优先级低的线程则获得较少的执行机会。
未完待续。。。
新闻热点
疑难解答