প্ল্যাটফর্ম.আরুনলেটার এবং জাভাএফএক্স-এ টাস্ক


90

আমি এটি নিয়ে কিছু গবেষণা করে চলেছি তবে আমি এখনও কমপক্ষে বলতে খুব বিভ্রান্ত হয়েছি।

কখন আমাকে কখন ব্যবহার করতে হবে Taskএবং কখন ব্যবহার করতে হবে তার একটি দৃ concrete় উদাহরণ আমাকে দিতে পারেন Platform.runLater(Runnable);? ঠিক পার্থক্য কি? এগুলির কোনটি কখন ব্যবহার করবেন সে সম্পর্কে কি একটি সুবর্ণ নিয়ম রয়েছে?

আমি ভুল হলে আমাকেও সংশোধন করুন তবে এই দুটি "অবজেক্টস" কোনও জিইউআইতে মূল থ্রেডের ভিতরে অন্য থ্রেড তৈরি করার উপায় নয় (জিইউআই আপডেট করার জন্য ব্যবহৃত হয়)?

উত্তর:


110

ব্যবহার করুন Platform.runLater(...)দ্রুত এবং সহজ অপারেশন এবং Taskজটিল এবং বড় অপারেশনের জন্য।

উদাহরণ: কেন আমরা Platform.runLater(...)দীর্ঘ গণনার জন্য ব্যবহার করতে পারি না (নীচের রেফারেন্স থেকে নেওয়া)।

সমস্যা: পটভূমি থ্রেড যা কেবল 0 থেকে 1 মিলিয়ন পর্যন্ত গণনা করা হয় এবং ইউআইতে অগ্রগতি বার আপডেট করে।

কোড ব্যবহার করে Platform.runLater(...):

final ProgressBar bar = new ProgressBar();
new Thread(new Runnable() {
    @Override public void run() {
    for (int i = 1; i <= 1000000; i++) {
        final int counter = i;
        Platform.runLater(new Runnable() {
            @Override public void run() {
                bar.setProgress(counter / 1000000.0);
            }
        });
    }
}).start();

এটি কোডের একটি ঘৃণ্য কান্ড, প্রকৃতির বিরুদ্ধে অপরাধ (এবং সাধারণভাবে প্রোগ্রামিং)। প্রথমে, আপনি রান্নেবলের এই ডাবল নেস্টিংয়ের দিকে তাকিয়ে মস্তিষ্কের কোষগুলি হারাবেন। দ্বিতীয়ত, এটি সামান্য রান্নেবলের সাথে ইভেন্টের সারি दलदल করতে চলেছে - বাস্তবে তাদের কয়েক মিলিয়ন million স্পষ্টতই, ব্যাকগ্রাউন্ড কর্মীদের লেখাটি আরও সহজ করে তুলতে আমাদের কিছু এপিআই দরকার যা পরে ইউআইয়ের সাথে যোগাযোগ করে।

টাস্ক ব্যবহার করে কোড:

Task task = new Task<Void>() {
    @Override public Void call() {
        static final int max = 1000000;
        for (int i = 1; i <= max; i++) {
            updateProgress(i, max);
        }
        return null;
    }
};

ProgressBar bar = new ProgressBar();
bar.progressProperty().bind(task.progressProperty());
new Thread(task).start();

এটি পূর্ববর্তী কোডটিতে প্রদর্শিত কোনও ত্রুটি থেকে ভোগাচ্ছে

তথ্যসূত্র: জাভাএফএক্স ২.০ এ কর্মী থ্রেডিং


এনসেম্বল অ্যাপ লিঙ্কে টাস্ক উদাহরণটি আর কাজ করবে না।
কিগোমাস্টিক

এটি সঠিক লিঙ্ক তবে আমি সম্পাদনা করতে পারছি না কারণ সম্পাদনাটি কেবলমাত্র 2 টি অক্ষর।
অ্যারাস

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

আমি প্রতিটি দৃশ্যের একটি চিত্র সংরক্ষণ করতে চাই - এবং এতে সময় লাগবে। টাস্কের মাধ্যমে আলাদা থ্রেডে চালিত হওয়ার পরেও কি সমস্যা তৈরি হবে? আমি বুঝেছি যে সমস্ত গুই সম্পর্কিত কাজ Fx অ্যাপ্লিকেশন থ্রেডে হওয়া দরকার।
স্টিফেনবশ

@ সের্গেই-তাচেনভ সুতরাং আপনি যেমন অগ্রগতির মতো একক সম্পত্তি আপডেট করার চেয়ে আরও কিছু করতে চান এমন ক্ষেত্রে জিইউআই থ্রেড আপডেট করার জন্য আপনি কোনও টাস্ক থ্রেড থেকে রানলটার () ব্যবহার করেন?
সরল ব্যবহারকারী

59
  • Platform.runLater: যদি আপনাকে নন-জিইউআই থ্রেড থেকে কোনও জিইউআই উপাদান আপডেট করতে হয়, আপনি নিজের আপডেটটি একটি সারিতে স্থাপন করতে এটি ব্যবহার করতে পারেন এবং এটি GUI থ্রেডটি যত তাড়াতাড়ি সম্ভব পরিচালনা করা হবে।
  • TaskWorkerআপনি যখন জিইউআই থ্রেডের বাইরে দীর্ঘ কাজ চালানোর প্রয়োজন হয় তখন আপনার ইন্টারফেসটি প্রয়োগ করে (আপনার অ্যাপ্লিকেশন হিমায়িত এড়াতে) তবে কিছু পর্যায়ে GUI এর সাথে ইন্টারঅ্যাক্ট করতে হবে।

আপনি যদি সুইংয়ের সাথে পরিচিত হন SwingUtilities.invokeLaterতবে পূর্বেরটি সমতুল্য এবং পরবর্তীটির ধারণার সাথে সমান SwingWorker

কাজের javadoc অনেক উদাহরণ আছে যা নির্মল উচিত কিভাবে তারা ব্যবহার করা যেতে পারে দেয়। আপনি একযোগে টিউটোরিয়ালটিও উল্লেখ করতে পারেন ।


ধন্যবাদ প্ল্যাটফর্ম কীভাবে ব্যবহার করতে হয় তার একটি ছোট উদাহরণ দিতে পারেন? আপনি এটি গুই থ্রেডের বাইরে ব্যবহার করতে পারেন বা? এবং ডক্সে কার্যের উদাহরণগুলি প্রকৃতপক্ষে অস্পষ্ট
মার্ক রাসমুসেন

হ্যাঁ প্ল্যাটফর্ম.আরুনলেটর জিইউআই থ্রেডের বাইরে ব্যবহার করা যেতে পারে - এটিই এর মূল উদ্দেশ্য। জাভাডোকের চেয়ে কাজের তথ্যগুলিতে আপনি এই টিউটোরিয়ালটি পেতে পারেন।
Assylias

4
আপনি প্ল্যাটফর্ম.আরুনলেটার এর মতো ব্যবহার করেন:Platform.runLater(new Runnable() {public void run() {updateYourGuiHere();}});
Assylias

আমি আবার জিইউআই উপাদানগুলি কীভাবে ব্যবহার করতে সক্ষম হব =: এস
মার্ক রাসমুসেন

4
@ কেভিনমারেডিথ এফএক্স থ্রেডে টাস্কের কল পদ্ধতিটি কল করা উচিত নয় - তবে টাস্ক সেতুর পদ্ধতি (আপডেটপ্রোগ্রেস ইত্যাদি) সরবরাহ করে যা এফএক্স থ্রেডে চলমান। আরও তথ্যের জন্য জাভাডোক এবং টিউটোরিয়ালগুলি দেখুন।
Assylias

12

এটি এখন ল্যাম্বডা সংস্করণে পরিবর্তন করা যেতে পারে

@Override
public void actionPerformed(ActionEvent e) {
    Platform.runLater(() -> {
        try {
            //an event with a button maybe
            System.out.println("button is clicked");
        } catch (IOException | COSVisitorException ex) {
            Exceptions.printStackTrace(ex);
        }
    });
}

8
আপনি যদি কোনও জিইউআই ইভেন্ট পরিচালনা করছেন তবে আপনি জিইউআই থ্রেডে রয়েছেন। আপনি তখন রানলটার () ব্যবহার করবেন কেন?
টিফুটো

আপনি যখন ঠিক বলেছেন, ক্যাগলারের উত্তরটি লাম্বডা এক্সপ্রেশনটির ব্যবহারটি হাইলাইট করার চেষ্টা করেছিল, একটি ভাল কোডিং উদাহরণ দেওয়ার প্রয়োজন হয় না। আমি ব্যবহার করিPlatform.runLater(() -> progressBar.setProgress(X/Y));
তাইলেসিন

2

এক্সপ্লিটাইট প্ল্যাটফর্ম.আরুনলটার () ব্যবহার করার একটি কারণ হ'ল আপনি ইউআইতে কোনও সম্পত্তি কোনও পরিষেবা (ফলাফল) সম্পত্তিতে আবদ্ধ করতে পারেন। সুতরাং আপনি যদি সীমাবদ্ধ পরিষেবার সম্পত্তি আপডেট করেন তবে আপনাকে রানলেটার () এর মাধ্যমে এটি করতে হবে:

ইউআই থ্রেডে জাভাএফএক্স অ্যাপ্লিকেশন থ্রেড হিসাবেও পরিচিত:

...    
listView.itemsProperty().bind(myListService.resultProperty());
...

পরিষেবা বাস্তবায়নে (পটভূমি কর্মী):

...
Platform.runLater(() -> result.add("Element " + finalI));
...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.