创建线程的两种方式:
线程的实现依靠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不会