Java的多线程实现方式
Thread类实现方式
线程要执行的代码写在thread的 run方法中
实例代码:
package lmw14;
public class ThreadTest {
public static void main(String[] args) {
Thread thread = new TestThread();
thread.start();
for (int i=0;i<20000;i++){
System.out.println("main 线程输出为:"+i);
}
}
}
class TestThread extends Thread{
@Override
public void run() {
for (int i=0;i<200000;i++) {
System.out.println("test 线程输出为:"+i);
}
}
}
thread.start()开启多线程,如果使用thread.run()则会先执行run方法,相当于单线程
Runnable方式
package lmw14;
public class RunTest {
public static void main(String[] args) {
Thread thread = new Thread(new RunableTest());
thread.start();
for(int i=0;i<20000;i++){
System.out.println("main 线程的输出为:"+i);
}
}
}
class RunableTest implements Runnable{
@Override
public void run() {
for(int i=0;i<20000;i++) {
System.out.println("test 线程 输出为:"+i);
}
}
}
实现runnale接口,在run()方法中实现线程上的代码
线程的生命周期及状态转换
线程的调度
sleep()
让线程进入阻塞态
代码
package lmw14;
public class SleepTest {
public static void main(String[] args) throws Exception{
Thread thread = new Thread(new TaskForSleep(), "线程二");
thread.start();
for (int i=0;i<10;i++){
Thread.sleep(500);
System.out.println("主线程正在输出:"+i);
}
}
}
class TaskForSleep implements Runnable{
@Override
public void run() {
for (int i=0;i<10;i++) {
try {
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName()+"正在输出:"+i);
}catch (Exception e){
e.printStackTrace();
}
}
}
}
yield()
不会阻塞该线程,而是将其转换成就绪状态,让系统的调度器重新调度一次,当某线程使用yield()方法之后,只有与当前线程优先级相同或者更高的线程才能获得执行机会。
代码
package lmw14;
public class YieldTest {
public static void main(String[] args) {
Thread t1 = new Thread(new YieldRun(), "线程A");
Thread t2 = new Thread(new YieldRun(), "线程B");
t1.start();
t2.start();
}
}
class YieldRun implements Runnable{
@Override
public void run() {
for (int i=0;i<10;i++) {
System.out.println(Thread.currentThread().getName()+"------"+i);
if(i==3 || i==5){
System.out.println(Thread.currentThread().getName()+"让步");
Thread.yield();
}
}
}
}
多线程同步
synchronized关键字
将处理共享资源的代码放在一个使用该关键字来修饰的代码中,这个代码块被称作同步代码块
synchronized(lock){
//lock为自己定义的一个对象
//操作共享资源代码块
}
synchronized 返回值类型 方法名([参数1,,参数2...]){}