版权声明:不要随便复制~~ 技术更新有些东西也会相应更新 https://blog.csdn.net/chuxin_mm/article/details/84966339
如果用加锁的多线程,最好使用redis的分布式锁代替;(加锁的多线程非常影响性能,可能会导致服务器卡死,宕机)
1. 继承Thread 无返回值
第一步: 继承Thread
public class Person extends Thread {
// 重写线程中的run方法
@Override
public void run() {
// 线程休眠,表示该代码1秒钟执行一次
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 1; i < 11; i++) {
// 获取线程名称: getName()
System.out.println(getName() + ": 该代码需要被多线程执行" + i + "__" + new Date());
}
// 线程礼让,暂停当前正在执行的线程对象,并执行其他线程(让多个线程执行更加和谐)
Thread.yield();
}
}
第二步:
// 多线程运行程序
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
// 设置线程名称
p1.setName("线程1");
p2.setName("线程2");
p3.setName("主线程");
// 设置线程优先级,最大优先级为10,最小优先级为1,默认为5
// 线程优先级高仅仅表示线程获取的cpu时间片的几率高
p1.setPriority(10);
p2.setPriority(1);
// 后台(守护)线程,必须在线程启动前调用
// 当3线程死去之后,所有线程停止
p1.setDaemon(true);
p2.setDaemon(true);
p3.setDaemon(false);
// 中断线程
// p1.stop();
// p1.interrupt();
// 调用start()方法,就是先启动线程再调用run方法 (如果直接调用run()方法,其实就相当于普通的方法调用)
p1.start();
try {
// 等待该线程终止,再执行2、3线程
p1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
p2.start();
p3.start();
try {
Thread.sleep(100);
p3.interrupt();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Thread.currentThread().getName()
// 获取main方法所在线程的名称
System.out.println(Thread.currentThread().getName());// main
// 获取线程优先级(默认为5)
int priority = p1.getPriority();
int priority2 = p2.getPriority();
System.out.println(priority);
System.out.println(priority2);
}
2. 实现Runnable 无返回值
第一步: 实现Runnable接口
public class Person implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+": "+i);
}
}
}
第二步:
public static void main(String[] args) {
Person person = new Person();
// 创建2个线程对象
Thread t1 = new Thread(person,"线程1");
Thread t2 = new Thread(person,"线程2");
t1.start();
t2.start();
}
3. 实现Callable<V> 有返回值
第一步: 实现Callable
/**
* 使用多线程进行求和, 从1加到任意数字的运算
*
* @author wangqinmin
*
*/
public class MyCallable implements Callable<Integer> {
private int number;
public MyCallable(int number) { this.number = number;}
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i <= number; i++) {
sum += i;
}
return sum;
}
}
第二步:
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 创建带有2个线程的线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
// 多线程同时计算两个
Future<Integer> f1 = pool.submit(new MyCallable(100));
Future<Integer> f2 = pool.submit(new MyCallable(200));
Integer i1 = f1.get();
Integer i2 = f2.get();
System.out.println(i1);
System.out.println(i2);
}