বর্তমান থ্রেডটি মূল থ্রেড নয় কিনা তা কীভাবে পরীক্ষা করবেন


391

কোডের একটি নির্দিষ্ট টুকরোটি থ্রেডটি মূল (ইউআই) থ্রেড কিনা তা আমাকে পরীক্ষা করে দেখতে হবে। আমি কীভাবে এটি অর্জন করতে পারি?


থ্রেডের সাথে উদাহরণ হিসাবে দেখানোর উদাহরণ কোড 2concept.blogspot.in/2015/02/…
নীতেশ

উত্তর:



122

আপনি বর্তমান থ্রেডটি ইউআই / মেইন থ্রেড কিনা তা জানতে নীচের কোডটি ব্যবহার করতে পারেন

if(Looper.myLooper() == Looper.getMainLooper()) {
   // Current Thread is Main Thread.
}

অথবা আপনি এটি ব্যবহার করতে পারেন

if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
   // Current Thread is Main Thread.
}

এখানেও একই রকম প্রশ্ন


8
যে কোনও সালিশী থ্রেড একটি লুপারের সাথে জড়িত (মূল থ্রেডটি সর্বদা লুপারের সাথে জড়িত বলে ধরে নেওয়া হয়) এর কোনও গ্যারান্টি নেই বলে কোনওটিকে পরবর্তীটি নিরাপদ বিকল্প হিসাবে বিবেচনা করা উচিত?
জানুস ভারমার্কে

Looper.myLooper()থ্রেড কোনও লুপারের সাথে সম্পর্কিত না হলে নালায় ফিরে আসবে। সুতরাং উভয়ই সুরক্ষিত এবং একই ফলাফল রয়েছে তবে লুপার এবং এর সাথে সম্পর্কিত থ্রেডটি অনুসন্ধান করতে এবং অন্য কিছু স্টাফ করার জন্য মানচিত্রের ভিতরে অনুসন্ধান করার সময় প্রথমটি কিছুটা ধীর হয়।
সা Saeedদ মাসুমী

59

সবচেয়ে ভাল উপায় হ'ল পরিষ্কার, সবচেয়ে শক্তিশালী উপায়: *

Thread.currentThread().equals( Looper.getMainLooper().getThread() )

বা, যদি রানটাইম প্ল্যাটফর্মটি API এর স্তরের 23 (মার্শমেলো 6.0) বা উচ্চতর হয়:

Looper.getMainLooper().isCurrentThread()

দেখুন Looper এপিআই । দ্রষ্টব্য যে কলিংয়ের Looper.getMainLooper()সাথে সিঙ্ক্রোনাইজেশন জড়িত ( উত্স দেখুন )। আপনি রিটার্ন মানটি সংরক্ষণ করে এবং এটি পুনরায় ব্যবহার করে ওভারহেড এড়াতে চাইতে পারেন।

   * ক্রেডিট গ্রেগ 7gkb এবং 2cupsOfTech


"এপিআই 23 বা ততোধিক উচ্চতর" বলতে কী বোঝ? এটি আমার কাছে খুব একটা বোঝায় না ... ঠিক একই উত্তরটি নীচে অংকিত পোস্ট করেছেন ...
মাইক

@ মাইকে ধন্যবাদ, আমি এপিআই বিট ঠিক করেছি। অংকিত আসলে অনুগ্রহ করে Looper.myLooper() == Looper.getMainLooper(), যা আমি কম পরিষ্কার বলে মনে করি। আমি গ্রেগ 7gkb ক্রেডিট করি।
মাইকেল অ্যালান

1
অ্যান্ড্রয়েড স্টুডিও একটি সতর্কতা উত্থাপন করায় এটি কি == বা সমান () এর সাথে তুলনা করা উচিত?
2cupsOfTech

@ 2cupsOfTech অন 2 য় ভাবা, এটা ভাল পরামর্শ। বর্তমানে রান দুটি সময়ে উভয় পরীক্ষা একই হয় কারণ থ্রেড ওভাররাইড হয় না equalsএবং তাই আবার পড়েও ==তবে ভবিষ্যতে এটি পরিবর্তন হতে পারে। তাই আমি উত্তরটি সংশোধন করেছি।
মাইকেল অ্যালান

25

সমাধানগুলির সংক্ষিপ্তসার হিসাবে, আমি মনে করি এটিই সেরা:

boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M 
    ? Looper.getMainLooper().isCurrentThread()
    : Thread.currentThread() == Looper.getMainLooper().getThread();

এবং, আপনি যদি ইউআই থ্রেডটিতে কিছু চালাতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
       //this runs on the UI thread
    }
});


2

আমাকে এটির উপস্থাপনের অনুমতি দিন: আমি স্বীকার করেছি যে এই পোস্টটির 'অ্যান্ড্রয়েড' ট্যাগ রয়েছে, তবে, আমার অনুসন্ধানের 'অ্যান্ড্রয়েড' এর সাথে কোনও সম্পর্ক ছিল না এবং এটি আমার শীর্ষ ফলাফল। এ লক্ষ্যে, অ-অ্যান্ড্রয়েড এসও জাভা ব্যবহারকারীদের এখানে অবতরণ করার জন্য, ভুলে যাবেন না:

public static void main(String[] args{
    Thread.currentThread().setName("SomeNameIChoose");
    /*...the rest of main...*/
}

এটি সেট করার পরে, আপনার কোডের অন্য কোথাও আপনি সহজেই যাচাই করতে পারবেন আপনি মূল থ্রেডের সাথে এটি সম্পাদন করতে চলেছেন:

if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
    //do something on main thread
}

কিছুটা বিব্রত হয়ে আমি এটি মনে রাখার আগে অনুসন্ধান করেছি, তবে আশা করি এটি অন্য কাউকে সাহায্য করবে!


1

আপনি এটিকে অ্যান্ড্রয়েড ডিডিএমএস লগকটে যাচাই করতে পারেন যেখানে প্রক্রিয়া আইডি একই হবে তবে থ্রেড আইডি আলাদা হবে।


1

Xamarin.Androidবন্দর: ( C#)

public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
    ? Looper.MainLooper.IsCurrentThread
    : Looper.MyLooper() == Looper.MainLooper;

ব্যবহার:

if (IsMainThread) {
    // you are on UI/Main thread
}

-6

আপনি থ্রেড.কন্ট্রেনথ্রেড () চেষ্টা করতে পারেন .ডেমোন ()


আমি নিশ্চিত না যে ইউআই থ্রেডটি একটি ডিমন তবে আমি আপনাকে এটিতে বিশ্বাস করব। তবে আপনি কীভাবে কোনও ডেমন থ্রেডের সাথে পার্থক্য তৈরি করতে পারবেন যা আমি তৈরি করতে পারি (তবে হওয়া উচিত নয়)।
এক্সেলএইচ

আমি আমার ওয়েব অ্যাপে পরীক্ষা করেছি, এটি দেখায় যে ইউআই থ্রেডটি ডেমন থ্রেড। আমি গ্রহন পরিবেশে কিছু ডিবাগ ব্রেক পয়েন্ট রেখেছি এবং তা যাচাই করেছি। থ্রেড বিশদটি থ্রেড হিসাবে দেখানো হয়েছে [http-bio-8080-exec-7,5, main]। কিছু ইউআই পৃষ্ঠায় ক্লিক করে ডিবাগ পয়েন্টটি পরীক্ষা করে checked
শৈলেন্দ্র সিং

এছাড়াও, থ্রেডের নামটিতে বিশদটি দেখানো হলেও এটি 'মাইন' দেখায় তবে থ্রেড অবজেক্টে সেটডেমোন (সত্য) কল করলে এটি ডিমন হয়ে যাবে।
শৈলেন্দ্র সিং

আপনি ভাল অংশটি পড়েন নি ... এটি ডেমন হওয়ার বিষয়ে আমি সন্দেহ (পুরোপুরি) করছিলাম না, আমি বলছিলাম যে আপনি এইরকম অন্য ডেমন থ্রেডের সাথে পার্থক্য তৈরি করতে পারবেন না।
এক্সেলএইচ

অন্য উপায়ে রাখুন: একটি প্রধান থ্রেড ডিমন থ্রেড হতে পারে তবে সমস্ত ডিমন থ্রেডই মূল থ্রেড নয়। (মূল থ্রেড সনাক্তকরণটি এখানে যা জিজ্ঞাসা করা হচ্ছে তা।)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.