thread

创建线程的两种方式:

线程的实现依靠run()方法中的线程体

创建线程类继承Thread类并实现run()方法,以此来创建

  • 第一个线程类:
    package com.zrm.threadFirst;

    public class Thread_one extends Thread{
    @Override
    public void run() {
    for (int i=0;i<1000000;i++){
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("111111111");
    }
    }
    }
  • 第二个线程类:
  • package com.zrm.threadFirst;

    public class ThreadTwo extends Thread{
    @Override
    public void run() {
    for (int i=0;i<1000000;i++){
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("222222222");
    }
    }
    }
  • 在一个主类中执行两个线程:
package com.zrm;

import com.zrm.threadFirst.ThreadTwo;
import com.zrm.threadFirst.Thread_one;

public class Main {
public static void main(String[] args) {
//实例两个线程对象
Thread_one th1 = new Thread_one();
ThreadTwo th2 = new ThreadTwo();
//启动线程
th1.start();
th2.start();
}


}执行如下:

第二种方法:创建runner类实现Runnable接口并且实现run()方法(线程体)

package com.zrm.threadSecond;

public class Runner_one implements Runnable{
@Override
public void run() {
for (int i=0;i<1000000;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("111111111");
}
}
}

package com.zrm.threadSecond;

public class Runner_two implements Runnable{
@Override
public void run(){
for (int i=0;i<1000000;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("222222222");
}
}
}

执行:
package com.zrm.threadSecond;

/**
* 第二种创建多线程的方法,实现Runnable接口
*/
public class Main {
public static void main(String[] args) {
//创建实现runnable接口run方法(线程体)的对应两个对象
Runner_one run1 = new Runner_one();
Runner_two run2 = new Runner_two();
//创建连个线程对象
Thread th1 = new Thread(run1);
Thread th2 = new Thread(run2);
//启动线程
th1.start();
th2.start();
}
}
结果:

 线程礼让:Thread.yield();

线程安全:

synchronized(){
}
解决办法,


StringBuilder和StringBuffer类可以解决String字符串如果频繁修改浪费内存空间的问题,String直接修改是重新开辟空间再指向,而前两个是在原空间内进行操作的,StringBuilder会出现线程安全问题,而StringBuffer不会


posted @ 2019-08-29 13:58  26417  阅读(209)  评论(0编辑  收藏  举报